淘汰赛 - 通知何时'带'指令被解雇
问题描述:
嗨,我有以下情况。淘汰赛 - 通知何时'带'指令被解雇
某些元素嵌套
<!-- 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指令内的元素被更新并重新应用时得到通知。 是否有一个淘汰赛具体的方式来实现这一目标?
非常感谢的帮助。
答
您得到此问题的原因是每次更新项目时,模板引擎都会销毁点击处理程序元素。
这是一个实现你想要的而不诉诸于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
很难说没有工作jsfeedle,但很少有事情要尝试:将部分包装到模板中并使用afterRender回调(http://knockoutjs.com/documentation/template-binding.html#note_3_using_afterrender_afteradd_and_beforeremove),或者使用委托的jquery事件(即通过选择器作为第二个参数) – Artem 2012-03-14 10:20:37
谢谢,我会看看。这是一个小提琴来说明问题。 http://jsfiddle.net/y6WwM/6/我已经解决了这个问题,通过每次更改项目时重新应用绑定,但这意味着我还有一件事需要注意。 – Chin 2012-03-14 11:07:06
这里是我的意思是由jquery委托事件:http://jsfiddle.net/y6WwM/7/ – Artem 2012-03-14 11:13:22