Data binding knockout.js数据绑定';与';与jQuery更改事件冲突

Data binding knockout.js数据绑定';与';与jQuery更改事件冲突,data-binding,knockout.js,onchange,Data Binding,Knockout.js,Onchange,出于某种原因,当我使用data bind=“with:detailedStudent”时,不会调用jQuery change()绑定。我正在动态填充select选项,但我不确定这是否重要。这是我使用的一些代码,只是为了让大家对正在发生的事情有一个像样的了解: var viewModel; $(document).ready(function() { viewModel = new StudentViewModel(); ko.applyBindings(viewModel);

出于某种原因,当我使用data bind=“with:detailedStudent”时,不会调用jQuery change()绑定。我正在动态填充select选项,但我不确定这是否重要。这是我使用的一些代码,只是为了让大家对正在发生的事情有一个像样的了解:

var viewModel;
$(document).ready(function() {  
    viewModel = new StudentViewModel();
    ko.applyBindings(viewModel); 

    // this change event is not getting called, but if i put the onchange directly into the html as an attribute, it works fine.
    $("#accountDialog").find("#mySelect").change(function() {
        alert('hi');
    }
}

function Student(data) {
    var self = this;    
    ko.mapping.fromJS(data, {}, this);                
}

function StudentViewModel() {
    var self = this;    
    this.students = ko.observableArray([]);    
    this.detailedStudent = ko.observable(); 
}

<div id="accountDialog" class="modal hide fade" data-bind="with: detailedStudent">
    <select id="mySelect" name="mySelect" data-bind="value: GraduationClassId"></select>
</div>
var模型;
$(文档).ready(函数(){
viewModel=新的StudentViewModel();
应用绑定(视图模型);
//不会调用此更改事件,但是如果我将onchange作为属性直接放入html中,它就可以正常工作。
$(“#accountDialog”).find(#mySelect”).change(函数(){
警报(“hi”);
}
}
函数学生(数据){
var self=这个;
fromJS(数据,{},this);
}
函数StudentViewModel(){
var self=这个;
this.students=ko.observearray([]);
this.detailedStudent=ko.observable();
}

带绑定的
模板
绑定的包装器。它复制子元素并将其用作模板。因此,如果您的
detailedStudent
正在更改,则每次KO都将呈现未附加事件处理程序的新元素

一些备选方案:

  • 使用绑定来附加事件处理程序(可以使用
    event
    binding)
  • 根据您的
    detailedStudent
    observable创建一个视图,并在视图模型中执行您的操作(如果您的操作不涉及DOM操作,则为最佳选项)
  • 尝试使用委托事件处理程序,如jQuerys
    $.on()

如果操作不涉及DOM操作,那么我同意RP Niemeyer的观点,手动订阅是最好的选择

但是,通常我们会有一些DOM操作事件,例如,将jquery对话框/datepicker插件设置到您的属性。我认为自定义绑定将是最好的选择。自定义绑定将与“with”binding子句完美配合,以将事件处理程序设置为任意javascript函数

你可以通读这篇文章,它并不像看上去那么难。

是的,这就是我添加的内容:this.GraduationClass.GraduationClassId.subscribe(函数(){alert('hi');});