3

以下のコードを実行すると、javascript ランタイム エラーが発生します。 Uncaught TypeError: Cannot read property 'name' of nulldep3アクセスする場合self.dep2().name

dep2の宣言を の宣言の上に移動すると、エラーはなくなりdep1ます。これは Knockout のバグですか、それとも何か間違っていますか? 以前の変更dep3の結果として再計算されているように思えますが、ノックアウトがこのシナリオを処理できると予想していました。dep1dep2

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

この場合、1 つのオプションは次のように調整すること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 に答える