Я работаю над проектом, который требует от меня использования пользовательского интерфейса Kendo вместе с Knockout.js для мобильного приложения, в качестве способа привязки этих библиотек я использую библиотеку Knockout-Kendo, приложение состоит из простого списка продуктов с подробные представления для каждого продукта и корзины, однако у меня возникают проблемы с обновлением количества товаров в моей корзине.
Я использую привязки нокаут-кендо в своем приложении следующим образом:
<div data-role="view" id="cart" data-title="Cart" data-layout="main-layout">
<div data-bind="if: items().length == 0">No items currently in cart</div>
<ul data-role="listview" data-style="inset" data-bind="kendoListView: { data: items, template: cartTemplate }"></ul>
</div>
где шаблон:
<script type="text/x-kendo-template" id="cartListTemplate">
<div class="km-listview-link cart-item-container" data-id="#= Id #">
<div class="product-image">
<img src="#= ImageUrl #">
</div>
<div class="product-description">
<p>#= Name #</p>
<p>#= formattedPrice #</p>
<p>#= quantity #</p>
</div>
<a data-role="button" data-icon="delete" class="km-primary" data-bind="click: removeItem">Delete</a>
</div>
</script>
и ViewModel:
CartViewModel : function () {
var self = this;
globalKo.cartItems = self.items = ko.observableArray(JSON.parse(localStorage.getItem('cart')) || []);
self.cartTemplate = kendo.template($('#cartListTemplate').html());
self.removeItem = function (vm, event) {
var element = $(event.target).parents('div.cart-item-container');
productId = element.data('id');
var cartItem = globalKo.cartItems().filter(function (element) {
return element.Id == productId;
})[0];
if (cartItem.quantity > 1) {
cartItem.quantity --;
} else {
self.items.remove(cartItem);
}
app.saveCart();
self.items.valueHasMutated();
}
}
Все это работает как задумано, за исключением того, что когда значение массива мутирует (вызывается функция valueHasMutated
или в массив добавляется или удаляется элемент) кнопки внезапно перестают быть кнопками и превращаются в простой текст, они также не работают, поскольку они прекратите вызывать функцию, к которой они привязаны. Как видно из фрагментов кода, привязка кликов выполняется с помощью разметки и не работает должным образом.
Возможно, стоит отметить, что я вызываю функцию valueHasMutated
, потому что в противном случае представление не обновляет количество товаров в корзине.
Чтобы проиллюстрировать проблему, вот несколько изображений:
Перед нажатием кнопки
После нажатия кнопки
Я не совсем понимаю, почему это происходит, я предполагаю, что это как-то связано с пользовательским интерфейсом Kendo, а не с Knockout.js.
Я также сделал скрипт, демонстрирующий проблему, вы можете найти его здесь