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

Javascript 创建一个工厂函数来创建ko.computed,javascript,knockout.js,Javascript,Knockout.js,我在这个概念上有点问题,我想知道你们中是否有人曾经这样做过 我对我目前的状况有一点了解: 您认为有没有一种方法可以将createRows函数转换为返回ko.computed的工厂,而不是让my self.itemrrows声明自己为computed 理想情况下,我的代码如下所示: self.itemRows = createRows(self.items(), 4); 让我知道你的想法,谢谢你 当然,您可以让一个函数返回一个计算的可观测值。但是,为了使计算函数正确更新,所有可观察到的

我在这个概念上有点问题,我想知道你们中是否有人曾经这样做过

我对我目前的状况有一点了解:

您认为有没有一种方法可以将createRows函数转换为返回ko.computed的工厂,而不是让my self.itemrrows声明自己为computed

理想情况下,我的代码如下所示:

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

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

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

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

当然可以,但你必须这样做

函数createRows(itemsObservable,itemsPerRow){
返回ko.computed(函数(){
返回(函数(项、项箭头){
var结果=[];
对于(变量i=0;i
非常感谢您的解释。我知道我应该试着打开它。敲除在哪里检测到一个ko.computed包含一个实际的可观察对象?@djk21108查看文档中的“依赖项跟踪如何工作”部分。@djk21108,如果我已经回答了你的问题,你应该接受答案。谢谢,接受。再次感谢。@GeorgeHowarth谢谢你给我指明了那个方向。当您的evaluator函数运行时,这一行非常有意义。,KO会记录您的evaluator读取的任何观察值(或计算观察值)。
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);