制作一个用于创建ko.computed的工厂函数

Make a factory function for creating ko.computed

本文关键字:ko 创建 computed 函数 工厂 用于 一个      更新时间:2023-09-26

我在这个概念上遇到了一点麻烦,我想知道你们中是否有人以前这样做过。

我掌握着我目前的状况:

http://jsfiddle.net/6xwSY/12/

你认为有没有办法把createRows函数变成一个返回ko.computed的工厂,而不是让我的self.itemRows必须将自己声明为computed。

理想情况下,我的代码看起来像:

    self.itemRows = createRows(self.items(), 4);

让我知道你的想法,谢谢!

当然,您可以让一个函数返回一个计算的可观测值。然而,为了使计算的正确更新,所有可观察的依赖关系都需要在计算的函数中"展开"。这将要求您更改函数以接受可观察的数组,而不是数组。

function createRows(itemsObservable, itemsPerRow) {
    return ko.computed(function () {
        var items = itemsObservable() ....
    });
}

http://jsfiddle.net/mbest/6xwSY/13/

当然,但您必须传入可观察对象本身。

function createRows(itemsObservable, itemsPerRow) {
    return ko.computed(function () {
        return (function(items, itemsPerRow) {
            var result = [];
            for (var i = 0; i < items.length; i += itemsPerRow) {
                var row = [];
                for (var j = 0; j < itemsPerRow; ++j) {
                    if (items[i + j]) {
                        row.push(items[i + j]);
                    }
                }
                result.push(row);
            }
            return result;
        })(itemsObservable(), itemsPerRow)
    })
}
self.itemRows = createRows(self.items, 2);