6

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

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

我已经在 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>
4

2 回答 2

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);
    });
}
于 2012-06-24T12:58:29.413 回答
0

在您的小提琴中,您的data-bind-s 中缺少逗号,这是一个固定示例:http: //jsfiddle.net/4aau4/1/

重新解决问题 - 它可能是与 KnockoutJS 相关的问题(即它在change事件触发后更新 observableArray),或者类似于我前段时间坚持的问题:在点击处理程序被调用之前检查复选框

编辑:

多么艰难的星期天,我想我还没醒:)

看一下这个片段: http: //jsfiddle.net/4aau4/2/ - 看起来 DOM 已正确更新,但它ko.observableArray落后了。($('input:checked').length表示实际检查了多少个复选框)。

于 2012-06-24T12:54:36.110 回答