淘汰赛 - 通知何时'带'指令被解雇

问题描述:

嗨,我有以下情况。淘汰赛 - 通知何时'带'指令被解雇

某些元素嵌套

<!-- 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

您得到此问题的原因是每次更新项目时,模板引擎都会销毁点击处理程序元素。

这是一个实现你想要的而不诉诸于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