knockoutjs ObservableArrays 和排序函数:UI 未更新
knockoutjs ObservableArrays and sort function: UI is not updated
在我的视图模型中,我有一个 knockoutjs ObserableArray。在我初始化视图模型后,它成功绑定了数据。然后,我需要做的是对集合进行排序。
$.each(vm.searchResults(), function (i, property) {
console.log(property.Name());
});
vm.searchResults().sort(function (a, b) {
return a.Name().toLowerCase() > b.Name().toLowerCase() ? 1 : -1;
});
$.each(vm.searchResults(), function (i, property) {
console.log(property.Name());
});
如您所见,我将元素的名称输出到控制台以查看排序前后的顺序。排序工作得很好。问题出在 UI 更新上。不知何故,UI 未更新。
然后,尝试使用以下代码从数组中删除记录,以查看 UI 是否会响应该记录:
vm.searchResults().shift();
UI 保持不变,不会再次更新。这里会有什么问题?
编辑:
这里也是一个示例案例:http://jsfiddle.net/tugberk/KLpwP/
这里也有同样的问题。
编辑:
我解决了以下示例中所示的问题: http://jsfiddle.net/tugberk/KLpwP/16/但我仍然不确定为什么它像我最初尝试的那样有效。
当你要对可观察数组进行排序时,你正在解开它。这是导致问题的原因,因为KO无法跟踪数组已更改。 ko.observableArray()
具有具有相同签名sort
功能,它将通知Observable的订阅者它已被更改。解决方案非常简单:删除牙套vm.searchResults().sort
=> vm.searchResults.sort
。看看我的例子:http://jsfiddle.net/RbX86/
告诉 KO 数组有变化的另一种方法 - 在对数组进行操作后调用valueHasMutated
方法。请查看此示例:http://jsfiddle.net/RbX86/1/当您需要在数组中进行许多更改并且只想刷新一次 UI 时,此方法非常有用。
相关文章:
- 如何在范围值更改时使用 angularJs 更新 UI
- 在日期更改后更新Angular UI引导程序日期选择器选项
- 只有当alert()在带有AJAX的internet explorer中使用时,Javascript才会更新UI
- UI网格AngularJS-如何更新UI网格中的列标题
- UI中未更新Knockout ObservableArray
- JQuery UI 对话框在第二次单击时不会更新
- jQuery UI 滑块动画未更新 UI vValue
- Angular/UI路由器-如何在不刷新所有内容的情况下更新URL
- 从jQuery UI滑块更改为'noUiSlider'-用于更新动画进度滑块的函数
- 保持我的 UI 更新,而不会因请求而终止服务器
- JavaScript 函数和 UI 更新
- 为什么 JavaScript 在这里阻止 UI 更新(通过 jquery)
- 在jquery UI更新上设置对象属性
- Kendo UI更新和创建不起作用
- 如何延迟.live()直到UI更新
- 如何在浏览器中强制UI更新,而冗长的javascript计算正在进行中
- Material-UI:更新库后代码不工作
- Jquery美元.when阻塞代码执行和UI更新
- 如何在循环中使用jQuery UI更新变量
- 优化定期 UI 更新