KO ObservableArray 更新在与 .sort 绑定时中断
KO ObservableArray update breaks when binding with .sort
我在标记中对我的ObservableArray
进行排序,但由于某种原因,当我将一个新对象推送到页面ObservableArray
时,这不会更新。
//store.get('pages') returns an ObservableArray
<!-- ko foreach:store.get('pages').sort(function (l , r ) { return l.pageNumber() < r.pageNumber() ? -1 : 1}) -->
<markup/>
<!--/ko-->
但是,当我删除排序调用时,它可以很好地捕获数组更改。这样
//works fine, updates when item pushed to observableArray
<!-- ko foreach:store.get('pages') -->
<markup/>
<!--/ko-->
对简单的解决方法有任何想法吗?
编辑:
尝试使用 valueHasMutated(),也不会强制更新。
解决方法: 我最终将排序调用移动到 observableArray 上的订阅中,它现在似乎工作正常,但不知道为什么。
store.get
返回一个observableArray
但store.get(...).sort(...)
返回一个数组。 您实际上是在进行如下所示的单向绑定:
<div data-bind="foreach: ['foo', 'bar']"></div>
此外,尽管您绑定了函数调用的返回值,但对我来说,它有一种代码气味,即您正在将业务逻辑与视图逻辑耦合。 你有这样的东西:
// View
<div data-bind="foreach: $root.get()"></div>
// Javascript
function ViewModel () {
var self = this;
self.get = function () {
return ko.observableArray();
};
}
它有效,但从你的角度来看,不清楚你在做什么。 我认为更好的解决方案是:
// View
<div data-bind="foreach: stores"></div>
// Javascript
function ViewModel () {
var self = this;
self.stores = ko.observableArray();
self.get = function () {
var arr = ["foo", "bar"];
stores(arr.sort(...));// When you do this, KO updates the foreach binding this is bound to
return stores;// not that you need to, you can access it from the viewModel.
};
}
很高兴您找到了解决方法,但请花一分钟时间规划您的 HTML 绑定结构。 这是我创建新视图时开始的第一个地方,它决定了我如何构建视图模型。
相关文章:
- 在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:同时使用单击和选中绑定时绑定评估的顺序