创建一个工厂函数来创建ko.computed

时间:2014-04-15 23:56:36

标签: javascript knockout.js

我对这个概念有点麻烦,我想知道你们之前是否有人这样做过。

我对我目前的状况有所了解:

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

您是否认为有办法将createRows函数转换为返回ko.computed的工厂,而不是让我的self.itemRows必须声明自己是计算的。

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

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

Lemme知道你的想法,谢谢你!

2 个答案:

答案 0 :(得分:2)

当然,您可以使用函数返回计算的observable。但是,为了使计算机正确更新,所有可观察的依赖关系需要在计算函数内“展开”。这将要求您更改函数以接受可观察数组而不是数组。

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

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

答案 1 :(得分:1)

当然,但您必须pass in the observable itself instead

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);