2012-04-07 74 views
6

如何在頁面加載後綁定新的元素創建?如何使用敲除來綁定新元素?

我有這樣的事情

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); 

如果我試試這個

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

但根據theseposts它不會工作。

回答

11

淘汰賽的目標是在一組dom元素上只召喚一次淘汰賽。因此,如果您在整個文檔中反覆調用applyBindings,那麼您將遇到多個綁定問題。

有幾種情況下,多次調用applyBindings是有道理的,這是在第一次綁定時不在dom中的部分視圖的情況下,因此沒有綁定。您可以通過選擇性地將applyBindings作用於該dom元素來綁定這些元素。

下面是您嘗試實現的示例。你的問題是你沒有插入你創建的節點。

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

我不會推薦這種方法對於這個特殊的例子,有一個更好的辦法。

如果您想要動態創建dom元素並讓它們被knockout綁定,最常見的方法是使用內置的模板功能,該功能負責插入元素並綁定找到的任何數據綁定屬性。

所以,如果你想創建一個數字按鈕你可以做

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

這裏有一個小提琴。

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

希望這有助於。

+1

我用你的解決方案嘗試了上面的小提琴,但它不再工作。任何想法? – guido 2014-05-09 15:22:49

+2

jsfiddles中的knockout.js鏈接不再有效。我將它們更新爲指向CDN鏡像。嘗試; http://jsfiddle.net/ACjvs/75/ http://jsfiddle.net/qSqJv/84/ – MrTrick 2014-09-03 02:27:11