javascript - knockout 计算未更新

标签 javascript knockout.js knockout-2.0

我正在尝试创建一个计算的可观察值并将其显示在页面上,我之前已经这样做过,但我开始怀疑 knockout 是否已经改变 - 除了totalAmount上的绑定(bind)之外,一切都有效 - 由于某种原因,它从未改变过改变...有什么想法吗?

我的模型如下:

var cartItem = function(item){
    this.itemName = item.title;
    this.itemPrice = item.price;
    this.itemID = item.id;
    this.count=0;
}
var cartModel = {
    self:this,
    footers:ko.observableArray([{title:'item1',text:'this is item1 text',image:'images/products/items/item1.png',price:15.99,id:1},
    {title:'item2',text:'this is item2 text',image:'images/products/items/item2.png',price:25.99,id:2},
    {title:'item3',text:'this is item3 text',image:'images/products/items/item3.png',price:55.99,id:3},
    {title:'item4',text:'this is item4 text',image:'images/products/items/item4.png',price:5.99,id:4},

]),
cart:ko.observableArray([]),
addToCart:function(){
if(cartModel.cart().length>0){
        for(var i=0;i<cartModel.cart().length;i++){
            if(this.id==cartModel.cart()[i].itemID){
                cartModel.cart()[i].count += 1;
            }
            else{
                cartModel.cart().push(new cartItem(this));
            }
        }
    }else{
        cartModel.cart().push(new cartItem(this));
    }
    console.log(cartModel.cart().length);  
}
}
this.cartModel.totalAmount=ko.computed(function(){
    return this.cart().length;    
},this.cartModel);
ko.applyBindings(cartModel);

这是相关的 HTML:

<div data-bind="template:{name:'footerTemplate',foreach:cartModel.footers}">
    <script type="text/html" id="footerTemplate">
        <div class="row">
            <span class="span2"><h3 data-bind="text: title"></h3></span>
            <span class="span2"><img data-bind="attr:{src: image}"/></span>
            <span class="span5" data-bind="text:text"></span>
            <span class="span1" data-bind="text:price"></span>
            <spand class="span2"><button data-bind="click:$parent.addToCart">add</button></span>
        </div>
    </script>
</div>
<div class="row">
    <span class="span2" data-bind="text:totalAmount"></span>
</div>

最佳答案

您正在内部数组上调用 push 方法,而不是 observableArray 包装器上的方法,因此永远不会通知更改。

即而不是:

cartModel.cart().push(new cartItem(this));

简单地使用:

cartModel.cart.push(new cartItem(this));

有关更多信息,请查看official documentation对于 observableArray,特别是“从 observableArray 读取信息”和“操作 observableArray”部分。

关于javascript - knockout 计算未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16543017/

相关文章:

javascript - 将鼠标悬停在 id 上时会更改图像

javascript - 如何在javascript中做一个动态的脉动按钮?

javascript - Google Slides API 无法从页面实例读取幻灯片内容 (Node.Js)

javascript - Knockout.js 中使用 if :clause 的嵌套循环

javascript - 如果我返回一个以 promise 作为对象的自定义映射数组,我该如何访问服务响应数据?

javascript - KnockoutJS 数组

javascript - knockout 难度大

knockout.js - 由于 asp.net 使用插值将 Underscore 模板与 Knockout 一起使用

javascript - knockout JS错误: "The value for a submit binding must be a function"

javascript - 交换 observableArray 中的 2 个项目 - knockout