2012-03-14 64 views
0

嗨,我有以下情況。淘汰賽 - 通知何時'帶'指令被解僱

某些元素嵌套

<!-- ko with: model.selected_item --> 
<tr> 
<td style="width:20%">Name:</td> 
<td style="width:80%" class="field" data-bind="text: name"></td> 
<td style="width:10px"><div class="btn_edit"></div></td> 
</tr> 
<tr> 
etc... 
<!-- /ko --> 
$("div.btn_edit", component.context).on("vclick", function(e){ 
//edit it 
} 

我的問題是內部的,如果selected_item變化 - 我鬆上的編輯按鈕綁定。 在這種情況下,訂閱model.selected_item並重新應用綁定有點困難 - 所以我希望在with指令內的元素被更新並重新應用時得到通知。 是否有一個淘汰賽具體的方式來實現這一目標?

非常感謝的幫助。

+0

很難說沒有工作jsfeedle,但很少有事情要嘗試:將部分包裝到模板中並使用afterRender回調(http://knockoutjs.com/documentation/template-binding.html#note_3_using_afterrender_afteradd_and_beforeremove),或者使用委託的jquery事件(即通過選擇器作爲第二個參數) – Artem 2012-03-14 10:20:37

+0

謝謝,我會看看。這是一個小提琴來說明問題。 http://jsfiddle.net/y6WwM/6/我已經解決了這個問題,通過每次更改項目時重新應用綁定,但這意味着我還有一件事需要注意。 – Chin 2012-03-14 11:07:06

+0

這裏是我的意思是由jquery委託事件:http://jsfiddle.net/y6WwM/7/ – Artem 2012-03-14 11:13:22

回答

1

您得到此問題的原因是每次更新項目時,模板引擎都會銷燬點擊處理程序元素。

這是一個實現你想要的而不訴諸於jquery委託綁定的方法的例子,雖然他們工作時他們正在用不必要的dom操作來污染你不錯的KO模型。每當我發現自己用KO應用程序使用舊的$()選擇器時,我必須認真考慮是否有更好的面向模型的方式。

http://jsfiddle.net/madcapnmckay/EFQ9S/

這樣做的主旨是你的模型轉化成真正的JS類,並使用這些綁定KO點擊事件,而不是jQuery的點擊處理程序。這種方法的美妙之處在於KO在被摧毀時會爲你重新塑造元素。

var item = function (config) { 
    var self = this; 
    this.name = ko.observable(config.name); 
    this.edit = function() { 
     $("body").append("<div>lets edit " + self.name()+"</div>"); 
    }; 
}; 

var model = function() { 
    this.item = ko.observable(); 
    this.pushNew = function() { 
     this.item(new item({name: "new name"})); 
    }; 
} 

$(document).ready(function(e) { 
    var mymodel = new model(); 
    ko.applyBindings(mymodel); 

    mymodel.item(new item({ name: "the_name" })); 
}) 

希望這會有所幫助。

+0

有趣的感謝。 – Chin 2012-03-19 13:27:56