4

我不知道如何访问已通过与绑定checked关联的方法中的click绑定更新的值?

似乎checked绑定在绑定之后评估click,因为在click绑定方法/处理程序中我无法访问computed依赖于与checked绑定同步的数组的属性值。

单个复选框的模板:

<script id="singleFilterTemplate" type="text/html">
    <li>
        <input type="checkbox" data-bind="attr: { value: id }, 
                                          click: $root.testMethod,
                                          checked: $parent.selectedFilterIds">
    </li>
</script>

我遵循视图模型的层次结构:

- TopLevelViewModel ($root in template above, defines computed aggregatedSelectedIds property)
---- GroupViewModel_0 ($parent in template above)
-------FilterViewModel_0_0 (Each FilterViewModel is associated with a check box)
-------FilterViewModel_0_N 
---- GroupViewModel_N
-------FilterViewModel_N_0 
-------FilterViewModel_N_N 
  • checked: $parent.selectedFilterIds:每次选中/取消选中复选框时 -TopLevelViewModel.selectedFilterIds数组中的相应项目都会更新
  • click: $root.testMethod:在单击复选框时,我试图获取所有复选框的当前状态,为此我引入了计算属性aggregatedSelectedIds,该属性运行良好并表示所有GroupViewModel.selectedFilterIds值的聚合状态,基本上它聚合了所有selectedFilterIds属性的元数据成单个值,testMethod()我只是在调用alert(topLevelViewModel.aggregatedSelectedIds())以确保此属性表示当前选定过滤器的列表。

所以每次testMethod()通过绑定调用click- 我看到过滤器的先前状态(值,由 计算aggregatedSelectedIds)。那么有没有办法在checked绑定之前强制/推送/评估click绑定?我尝试event了绑定,但得到了相同的结果。也许我以错误的方式这样做并且错过了一些明显的东西?

4

3 回答 3

4

您可以通过执行订阅对 selectedFilterIds 的更改

this.selectedFilterIds  = ko.observable();
this.selectedFilterIds.subscribe(function (value) {
    //Code from your click method goes here
});
于 2012-04-12T11:48:22.507 回答
1

由于选中复选框将基本上同时触发选中事件和单击事件,因此浏览器只是决定首先触发其中一个处理程序,因此一个简单的解决方法是在单击处理程序中使用超时。

类似的东西setTimeout(function() { stuff }, 1)应该可以工作。

把它放在你的点击处理程序中会“跳”出处理程序,让检查的处理程序触发并执行,然后它会返回到你的超时回调中的代码(如果你的检查处理程序足够快可以完成,则在等待 1ms 之后在此之前,我对此表示怀疑)

即使检查的处理程序首先在其他浏览器中触发,这个解决方案仍然可以正常工作。

于 2012-04-11T21:30:49.890 回答
0

通常,方法会按照您好的顺序进行绑定和执行。绑定它们。看起来您首先绑定的是单击。不确定从 data-bind attr 中的 knockoutjs 是如何处理这个问题的?

例如

$(this).click(function () { alert(1);})
    .click(function() {alert(2);});

// alert(1) is first 

我意识到那是 jquery,但纯 js 中的事件绑定也是如此。

真正做到这一点的最好方法是延迟或承诺,但我不知道这在 knockoutjs 中是如何工作的 :(

于 2012-04-11T21:28:27.187 回答