Knockoutjs:同时使用单击和选中绑定时绑定评估的顺序
Knockoutjs: Order of the bindings evaluation when using click and checked bindings in the same time
我不知道如何访问已通过在与click
绑定关联的方法中的checked
绑定而更新的值?
似乎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
计算)。那么有没有办法在click
绑定之前强制/推送/评估checked
绑定呢?我尝试event
绑定,但得到了相同的结果。也许我以错误的方式这样做并错过了一些明显的东西?
您可以通过执行以下操作来订阅对 selectedFilterId 的更改
this.selectedFilterIds = ko.observable();
this.selectedFilterIds.subscribe(function (value) {
//Code from your click method goes here
});
由于选中复选框将基本上同时触发选中和单击事件,因此浏览器只是决定首先触发其中一个处理程序,因此一个简单的解决方法是在单击处理程序中使用超时。
像setTimeout(function() { stuff }, 1)
这样的东西应该有效。
将其放入您的点击处理程序中会"跳出"处理程序,让检查的处理程序触发并执行,之后它会返回到超时回调中的代码(如果您检查的处理程序足够快,则等待 1 毫秒后完成在此之前,我对此表示怀疑)
即使检查的处理程序首先在其他浏览器中触发,此解决方案仍然可以正常工作。
通常,方法按照您很好地绑定它们的顺序执行..绑定它们..看起来您首先绑定单击。不确定 knockoutjs 如何从数据绑定属性中处理这个问题?
例如
$(this).click(function () { alert(1);})
.click(function() {alert(2);});
// alert(1) is first
我意识到这是jquery,但是纯js中的事件绑定也这样做。
真的最好的方法是使用延期或承诺,但我不知道这在 knockoutjs :( 中是如何工作的
- 在VanillaJS中模拟模型双向数据绑定
- 无法通过数组映射绑定
- 主干-不管怎样,检查事件以前是否绑定过
- 用于搜索的聚合物嵌套绑定
- Angular:更新一次性绑定的数据
- 如何使用ngrepeat和双向绑定获得指令的隔离范围
- react.js中的密钥绑定
- 使用regex的jquery keydown绑定不会验证撇号和句点
- 将事件处理程序绑定到任何可能的事件
- AngularJS指令只识别双向绑定类型
- Telerik rad组合框多列数据绑定
- 对API数据使用声明性绑定
- 如何销毁/删除/取消绑定SnapSVG.js
- 在D3.js中,有没有任何方法可以将x和y方向上的滚动事件绑定到平移svg
- 数据绑定:'系统Char'不包含名为'xxxxx'
- react组件中的绑定方法
- 如何将ngrepeat下的ngmodel绑定到$scope
- WinJS内联绑定语法
- 为什么Angular 1.5双向绑定在将作用域变量传递给组件绑定时失败
- Knockoutjs:同时使用单击和选中绑定时绑定评估的顺序