KnockoutJS计算了observable undefined

Mar*_*son 1 javascript knockout.js

我有这个非常简单的knockoutjs脚本.我的视图模型包含一个名为'modules'的属性,它是一个字符串数组.如果我有这样的foreach列表,它会打印每个项目的模块列表:

<tbody data-bind="foreach: items">
    <tr>
        <td data-bind="text: modules"></td>
    </tr>
</tbody>
Run Code Online (Sandbox Code Playgroud)

但是如果我想通过添加计算的observable来打印模块的数量:

<tbody data-bind="foreach: items">
    <tr>
        <td data-bind="text: numModules"></td>
    </tr>
</tbody>
Run Code Online (Sandbox Code Playgroud)

我遇到了问题.'undefined'不是它在我计算函数的第一行所说的函数.我的js代码看起来像这样:

function AppViewModel(data) {
    var self = this;
    ko.mapping.fromJS(data, {}, this);
    this.numModules = ko.computed(function() {
        return self.modules().length;
    });
};

$.getJSON("/api/items", function(data) {
    var viewModel = new AppViewModel(data);
    ko.applyBindings(viewModel);
});
Run Code Online (Sandbox Code Playgroud)

bea*_*mes 7

在这种情况下,计算机可能在属性实际存在之前尝试计算.默认情况下,ko.computed中未设置的一个参数是deferEvaluation参数...一旦设置了此参数,计算机将不会尝试计算AppViewModel的初始化.

this.numModules = ko.computed({ 
    read: function() {
        return self.modules().length;
    },
    deferEvaluation: true
);
Run Code Online (Sandbox Code Playgroud)

更挑剔的是,如果你定义'self = this',那么在下一行中用'this'的上下文设置你的计算,为什么你定义'self'?