3

运行以下代码时出现 javascript 运行时错误。 Uncaught TypeError: Cannot read property 'name' of nulldep3访问时self.dep2().name

dep2如果我将的声明移到dep1. 这是淘汰赛中的错误还是我做错了什么?在我看来,dep3由于dep1之前的更改dep2而被重新计算,但我希望 Knockout 能够处理这种情况。

function ViewModel () {
    var self = this;

    self.root = ko.observable(null);

    self.dep1 = ko.computed(function () {
        return self.root() ? self.root().prop1 : null;
    });

    self.dep2 = ko.computed(function () {
        return self.root() ? self.root().prop2 : null;
    });

    self.dep3 = ko.computed(function () {
        if (self.dep1()) {
            return self.dep2().name;
        }
    });
}

globalViewModel = new ViewModel();

globalViewModel.root({
    prop1: {name: "ThisIsPropOne"},
    prop2: {name: "thisIsPropTwo"}
});
4

1 回答 1

2

您对评估依赖项的方式是正确的。更改root将触发dep1dep2重新评估,但更改会首先dep1触发dep3

在这种情况下,一种选择是dep3像这样节流:

self.dep3 = ko.computed(function () {
    if (self.dep1()) {
        return self.dep2().name;
    }
}).extend({ throttle: 1 });

否则,请在此处查看 Michael Best 的延迟更新插件:https ://github.com/mbest/knockout-deferred-updates ,它将以比节流更强大的方式正确处理此问题。

于 2013-05-14T21:43:49.220 回答