【发布时间】:2016-04-13 20:19:03
【问题描述】:
我正在开发一个项目,该项目要求我将 Kendo UI 和 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 函数被调用或数组添加或删除了一个元素)突然按钮不再是按钮并变成简单的文本,它们也不会'不起作用,因为他们停止调用他们绑定的函数。从代码 sn-ps 可以看出,点击绑定是通过标记完成的,不能按预期工作。
值得注意的是,我正在调用 valueHasMutated 函数,否则视图不会更新购物车中的商品数量。
为了说明问题,这里有一些图像:
按下按钮之前
按下按钮后
我不太明白为什么会发生这种情况,我猜它与 Kendo UI 有关,而与 knockout.js 无关。
我也做了一个fiddle来演示这个问题,你可以找到它here
【问题讨论】:
标签: knockout.js kendo-ui knockout-kendo