您好我有以下情况。
某些元素嵌套在with
中<!-- 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 :(得分:1)
您遇到此问题的原因是,每次更新项目时,模板引擎都会销毁点击处理程序元素。
这是一个实现你想要的方法的例子,而不需要求助于jquery委托绑定,当他们工作时,他们正在使用不必要的dom操作来调整你不错的KO模型。每当我发现自己使用带有KO应用程序的旧$()选择器时,我必须认真考虑是否有更好的面向模型的方式。
http://jsfiddle.net/madcapnmckay/EFQ9S/
这样做的要点是将您的模型转换为真正的js类,并使用它们绑定KO click事件而不是jquery click处理程序。这种方法的优点在于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" }));
})
希望这有帮助。