2013-04-16 40 views
5

次のサンプルHTMLをご覧ください。それは簡単なKO foreachバインディングとobservableArrayに新しい項目を追加するためのボタンです。追加は正常に機能し、新しい項目が表示されます。しかし、afterRenderメソッドは、最初のバインディングの後ではなく、新しい項目の追加(およびレンダリング)の後ではなく、呼び出されることはありません。どうして?afterRenderが呼び出されないのはなぜですか?

フィドル:foreachバインディングのいずれかの配列またはあなたは、引数を追加するイベントを指定するオブジェクトを取るため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

あなたの構文が間違っています。 documentaiton:

から

は、あなたが反復処理したい配列を渡します。バインディングは、各エントリのマークアップセクションを 出力します。

または、反復処理する配列である dataというプロパティを持つJavaScriptオブジェクトリテラルを渡します。オブジェクトリテラル もあなたが書き込みを必要とする

...など afterAddincludeDestroyedのような他の特性を有していてもよい:

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

デモJSFiddle.

+0

愚かな私に、ありがとう! –