Dom 淘汰赛-通知何时';与';指令被触发

Dom 淘汰赛-通知何时';与';指令被触发,dom,knockout.js,Dom,Knockout.js,嗨,我有下面的场景 某些元素嵌套在具有 <!-- 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"

嗨,我有下面的场景

某些元素嵌套在具有

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

姓名:
等
$(“div.btn_edit”,component.context).on(“vclick”,函数(e){
//编辑它
}
我遇到的问题是,如果所选的_项发生更改,我会松开编辑按钮上的绑定。 在这种情况下,订阅model.selected_项并重新应用绑定有点困难,因此我希望在with指令中的元素更新并重新应用时收到通知。 是否有一种特定的击倒方式来实现这一点


非常感谢您的帮助。

您出现此问题的原因是,每次更新项目时,模板引擎都会销毁click handler元素

下面是一个不使用jquery委托绑定而实现所需的方法的示例,在jquery委托绑定工作时,它们会使用不必要的dom操作来争论您本来很好的KO模型选择器用KO应用程序我必须认真考虑是否有更好的面向模型的方式。

其要点是将您的模型转换为真正的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" }));
})
var item=函数(配置){
var self=这个;
this.name=ko.observable(config.name);
this.edit=函数(){
$(“body”).append(“让我们编辑”+self.name()+”);
};
};
var模型=函数(){
this.item=ko.observable();
this.pushNew=函数(){
这个项目(新项目({name:“new name”}));
};
}
$(文档).ready(函数(e){
var mymodel=新模型();
ko.应用绑定(mymodel);
项目(新项目({name:{u name}));
})

希望这能有所帮助。

不使用jsfeedle很难说,但可以尝试的事情很少:将节包装到模板中并使用afterRender回调(),或者使用委托的jquery事件(即,将选择器作为第二个参数传递给on)谢谢,我来看看。这里有一把小提琴来说明这个问题。我已经解决了这个问题,每次项目更改时都重新应用绑定,但这意味着我还有另一件事要注意。以下是我所说的jquery委托事件:谢谢Artem,这太完美了。如果你回答下面的问题,我会把它标记为正确。