2013-04-16 75 views
5

看看下面的示例HTML。這是一個簡單的KO foreach裝訂和一個按鈕來添加一個新項目到observableArray。加法工作正常,新項目顯示。但是,從不調用afterRender方法 - 不是在初始綁定之後,而是在添加(和呈現)新項目之後。爲什麼?爲什麼afterRender從來沒有打過電話?

小提琴:http://jsfiddle.net/CQNm6

HTML

<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <meta charset="utf-8" /> 
     <title></title> 
     <script type="text/javascript" src="http://knockoutjs.com/downloads/knockout-2.2.1.js"></script> 
    </head> 
    <body> 
     <div data-bind="foreach: data.things, afterRender: afterRenderTest"> 
      <h1 data-bind="text: name"></h1> 
     </div> 
     <a href="JavaScript:void(0);" onclick="data.things.push({ name: ko.observable('New Thing') });">Add New Thing</a> 

     <script type="text/javascript"> 
      var Thing = (function() 
      { 
       function Thing(p_name) 
       { 
        this.name = ko.observable(p_name); 
       } 

       return Thing; 
      })(); 
      var data = 
      { 
       things: ko.observableArray(
       [ 
        new Thing("Thing One"), 
        new Thing("Thing Two"), 
        new Thing("Thing Three") 
       ]) 
      }; 

      function afterRenderTest(elements) 
      { 
       alert("Rendered " + elements.length + " elements."); 
      } 

      ko.applyBindings(); 
     </script> 
    </body> 
</html> 

回答

12

你的語法是錯誤的,因爲foreach結合可以接受一個數組或您指定的其他事件,爭論的對象。

documentaiton:

傳遞要遍歷數組。綁定將爲每個條目輸出 的一段標記。

或者,傳遞一個JavaScript對象字面值,其名稱爲 data這是您希望遍歷的數組。文字對象 也可具有其它特性,如afterAddincludeDestroyed ...

所以你需要寫:

<div data-bind="foreach: { data: data.things, afterRender: afterRenderTest }"> 
    <h1 data-bind="text: name"></h1> 
</div> 

演示JSFiddle.

+0

傻我,謝謝! –

相關問題