0

因此,我正在ObservableArray对标记中的我进行排序,但由于某种原因,当我将新对象推送到 pagesObservableArray时,这不会更新。

//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 上的订阅中,现在它似乎工作正常,但不知道为什么。

4

1 回答 1

1

store.get返回一个observableArraystore.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 绑定结构。这是我在创建新视图时开始的第一个地方,它决定了我构建 ViewModel 的方式。

于 2013-09-10T23:04:13.450 回答