knockoutjs - 选择更改事件不会第一次触发

时间:2014-09-19 15:13:12

标签: knockout.js

我遇到一个select元素的问题。我为change事件创建了一个绑定,它在我手动更改所选元素时有效,但如果select元素与指定值绑定,则不会调用更改函数。

我的HTML是这样的:

<select data-bind="value: myfield, event:{change:myfunction}">
    <option value="">Select an element</option>
    <option value="1">Element 1</option>
    <option value="2">Element 2</option>
</select>

我需要它,以便如果属性myfield的值与''不同,则更改函数将执行。

如果我选择一个元素myfunction是调用的,一切正常,但是当页面加载时,例如myfield的值为“1”,函数不是调用,我需要这个函数将是执行,我希望你可以解决我的问题。

1 个答案:

答案 0 :(得分:23)

你因为战斗淘汰赛而遇到麻烦,而不是在这里使用 :-)。您应该通读the selectedOptions documentationoptions binding,或者甚至可以阅读一些KO tutorials

基本上,从不想要自己处理DOM元素的change事件。 Knockout就是这样做的:当DOM输入改变时更新你的ViewModel。此外,Knockout还应该负责为您生成option

你的HTML应该是这样的:

&#13;
&#13;
var ViewModel = function() {
    var self = this;
    self.availableOptions = [1, 2];
    self.myfield = ko.observable();

    self.myfield.subscribe(function(newValue) {
        // Handle a change here, e.g. update something on the server with Ajax.
        alert('myfield changed to ' + newValue);
    });
}

ko.applyBindings(new ViewModel());
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<select data-bind="options: availableOptions,
                       value: myfield,
                       optionsCaption: 'Select an element'">
</select>
&#13;
&#13;
&#13;

如果您确实需要订阅下拉列表中的更改,请订阅myfield更改,如上所示。