2013-05-14 93 views
1

我想創建一個計算的observable並將其顯示在頁面上,並且我已經這樣做過,但是我開始懷疑淘汰賽是否已經改變 - 除了totalAmount上的綁定之外,由於某種原因,它永遠不會改變......任何想法?淘汰賽計算沒有更新

我的模型如下:

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> 
+0

您的模型是否在車身標籤內? – 2013-05-14 12:25:09

+0

是的,對不起,我沒有包含所有的HTML,只是相應的代碼片段 – 2013-05-14 12:50:19

回答

1

您所呼叫的內部陣列上的方法,而不是在observableArray包裝,因此變更從未被通知。即

代替:

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

使用簡單:

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

欲瞭解更多信息看一看的official documentation爲observableArray,特別是在從observableArray的讀取信息和操作observableArray部分。

+0

啊!謝謝,我錯過了。 – 2013-05-14 12:51:33