Knockoutjs复选框已更改事件

时间:2012-06-24 12:50:06

标签: javascript mvvm knockout.js knockout-2.0

我的模型中有一些绑定到数组的复选框。这非常有用,当您选中一个框时,数组会相应更新。

但是当值发生变化时,我希望在我的模型上调用一个方法来过滤给定新值的结果。我已经尝试连接更改事件,但这似乎在更改之前而不是在更改之后具有值。

我在jsfiddle http://jsfiddle.net/LpKSe/中说明了我的问题,这可能会使这更有意义。

为了完整性,我的代码在这里重复。

JS

function SizeModel() {
    var self = this;
    self.sizes = ko.observableArray(["small", "medium", "large"]);
    self.sizes2 = ko.observableArray(["small", "medium", "large"]);
    self.getResults = function(e) {
        alert(self.sizes());
    };
    self.getResults2 = function(e) {
        alert(self.sizes2());
    };
}

$(document).ready(function() {
    sizeModel = new SizeModel();

    ko.applyBindings(sizeModel);
});​

HTML

<h3>Size
  <input type="checkbox" value="small"  data-bind=" checked: sizes, event:{change: getResults}"/>
  <span class='headertext'>Small</span>
  <input type="checkbox"  value="medium" data-bind=" checked: sizes, event:{change: getResults}"   />
  <span class='headertext'>Medium</span>
  <input type="checkbox"  value="large" data-bind=" checked: sizes, event:{change: getResults}"  />
  <span class='headertext'>Large</span>
</h3>
<h3>Size
 <input type="checkbox" value="small"  data-bind=" checked: sizes2, event:{click: getResults2}"/>
 <span class='headertext'>Small</span>
 <input type="checkbox"  value="medium" data-bind=" checked: sizes2, event:{click: getResults2}"   />
 <span class='headertext'>Medium</span>
 <input type="checkbox"  value="large" data-bind=" checked: sizes2, event:{click: getResults2}"  />
 <span class='headertext'>Large</span>
</h3>

2 个答案:

答案 0 :(得分:14)

您不需要更改事件。如果您订阅了observableArray,则会在更改时通知您,并传递更新的数组:http://jsfiddle.net/jearles/LpKSe/53/

function SizeModel() {
    var self = this;
    self.sizes = ko.observableArray(["3", "2", "1"]);
    self.sizes.subscribe(function(updated) {
        alert(updated);
    });
}

答案 1 :(得分:0)

在你的小提琴中你错过了data-bind - s中的逗号,这是一个固定的例子:http://jsfiddle.net/4aau4/1/

重新解决问题 - 它可能是与KnockoutJS相关的问题(即它在change事件被触发后更新observableArray),或者类似于我之前粘贴的内容:{{3} }

修改

多么艰难的星期天,我想我仍然没有醒来:)

请看一下这个代码段:Checkboxes are being checked before click handler is even called - 看起来DOM已正确更新,而ko.observableArray落后了。 ($('input:checked').length表示实际检查了多少个复选框。