2

値が更新されたときのタイムスタンプが必要です。ここでは説明しませんが、これはオブザーバブルvalueを指す書き込み可能な計算されたものvalueInstanceであるため、基本的に同じデータが表示されます。

オブザーバブルをサブスクライブすると、期待どおりに機能し、オブザーバブルが変更されたときにのみ起動します。計算されたものにサブスクライブすると、オブザーバブルがまだ未定義であっても、すぐに起動して誤ったタイムスタンプが発生します。これどうしたの?

http://jsfiddle.net/bNXhm/

更新:これは、計算されたdeferEvaluation: true

http://jsfiddle.net/bNXhm/1/

function VM(){
    var self = this;

    self.valueInstance = ko.observable();
    self.value = ko.computed({
        read: function () {
            return self.valueInstance();
        },
        write: function (value) {
            self.valueInstance(value);
        },
        deferEvaluation: true
    });

    self.timeStamp1 = ko.observable();
    self.value.subscribe(function (newValue) {
        self.timeStamp1(new Date());
    });

    self.timeStamp2 = ko.observable();
    self.valueInstance.subscribe(function (newValue) {
        self.timeStamp2(new Date());
    }); }
4

2 に答える 2

1

observable を作成すると、deferEvaluation を true に設定しない限り評価されます。オブザーバブル (または計算) が評価されると、常にサブスクライバーに通知されます。この時点では以前の値との比較はありません (値が変更された場合にのみ通知するため)。

「無駄な通知チェック」は、オブザーバブルのセッターで行われます。

そのため、コードで deferEvaluation を false で使用すると、読み取り関数がすぐに評価され、サブスクライバーに通知されます。しかし、現時点では購読者はいません。そのため、期間は設定されていません。

また、deferEvaluation : true を使用すると、applyBindings 関数で評価プロセスが遅延します。この時点ですでに購読しているため、タイムスパンが設定されています。

あなたの問題を解決するために、変更の記録を開始する必要があるときに格納する変数を作成します。

function VM(){

    var self = this;
    self.logged  = false;


    self.valueInstance = ko.observable();
    self.value = ko.computed({
        read: function () {
            return self.valueInstance();
        },
        write: function (value) {
            self.valueInstance(value);
        },
        deferEvaluation: true
    });

    self.timeStamp1 = ko.observable();
    self.value.subscribe(function (newValue) {
        if(self.logged)
            self.timeStamp1(new Date());
    });

    self.timeStamp2 = ko.observable();
    self.valueInstance.subscribe(function (newValue) {
        if(self.logged)
             self.timeStamp2(new Date());
    });
}
var vm  = new VM();
ko.applyBindings(vm);
vm.logged = true;

役立つことを願っています

フィドルを見る

于 2013-07-25T15:39:45.120 に答える