2013-04-16 15 views
5

Zobacz przykładowy kod HTML. Jest to proste powiązanie KO foreach i przycisk do dodania nowego elementu do observableArray. Dodatek działa poprawnie i pojawia się nowy element. Jednak metoda afterRender nigdy nie jest wywoływana - nie po początkowym powiązaniu, a nie po dodaniu nowego elementu (i renderowaniu). Czemu?Dlaczego afterRender nigdy nie jest wywoływany?

Fiddle: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> 

Odpowiedz

12

Twój składnia jest błędne, ponieważ wiązanie foreach albo wziąć tablicę lub obiekt, w którym należy określić dodatkowe imprezy, argumenty.

Z documentaiton:

Mijamy tablicę, którą chcesz iteracyjnego. Wiązanie wypisze sekcję znaczników dla każdego wpisu.

Można również przekazać literał obiektu JavaScript o właściwości o nazwie data, która jest tablicą, którą chcesz powtórzyć. Przedmiotem dosłowne mogą mieć również inne właściwości, takie jak afterAdd lub includeDestroyed ...

Więc trzeba napisać:

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

Demo JSFiddle.

+0

Silly me, dzięki! –

Powiązane problemy