2012-04-07 11 views
6

Jak powiązać nowy element utworzyć po załadowaniu strony?Jak wiązać nowe elementy za pomocą nokautu?

mam coś takiego

system = function() 
{ 

    this.hello = function() 
    { 
     alert("hello"); 
    } 

    this.makeUI = function(container) 
    { 
     div = document.createElement("div"); 
     div.innerHTML = "<button data-bind='click: hello'>Click</button>"; 
    } 
} 

ko.applyBindings(new system); 

Gdy próbuję to

this.makeUI = function(container) 
{ 
    div = document.createElement("div"); 
    div.innerHTML = "<button data-bind='click: hello'>Click</button>"; 
    ko.applyBindings(new system,div); 
}  

ale według theseposts to nie będzie działać.

Odpowiedz

11

Celem z nokautem jest wywołanie nokautu tylko raz na zestawie elementów dom. Dlatego jeśli wywołasz applyBindings wielokrotnie na całym dokumencie, będziesz miał problemy z wieloma powiązaniami.

Istnieje kilka przypadków, w których wielokrotne wywoływanie applyBindings jest uzasadnione i dotyczy to widoków częściowych, które nie znajdowały się w domenie w momencie pierwszego wiązania, a zatem nie były związane. Można je powiązać, wybierając wybiórczo opcje applyBindings do tego elementu dom.

Oto przykład tego, co próbujesz osiągnąć. Twoim problemem było to, że nie wstawiałeś utworzonego węzła.

http://jsfiddle.net/madcapnmckay/qSqJv/

Nie polecam tego podejścia na tym konkretnym przykładzie, istnieje lepszy sposób.

Jeśli chcesz dynamicznie tworzyć elementy dom i wiązać je poprzez nokaut, najbardziej powszechnym podejściem jest użycie wbudowanej funkcji szablonowania, która zajmuje się wstawianiem elementów i wiązaniem wszelkich znalezionych atrybutów wiązania danych.

Więc jeśli chcesz stworzyć szereg przycisków mógł zrobić swój

this.makeUI = function(container) 
{ 
    self.buttons.push({ 
     text: "button " + self.buttons().length, 
     handler: this.hello 
    }); 
} 

Oto skrzypce.

http://jsfiddle.net/madcapnmckay/ACjvs/

Nadzieja to pomaga.

+1

Próbowałem skrzypce powyżej z rozwiązaniem, ale już nie działa. Dowolny pomysł? – guido

+2

Łącze knockout.js w jsfiddles już nie działa. Zaktualizowałem je, by wskazywały lustro CDN. Próbować; http://jsfiddle.net/ACjvs/75/ http://jsfiddle.net/qSqJv/84/ – MrTrick

Powiązane problemy