0

これは一種の2つの部分の問題です。

まず、テンプレートバインディングでアフターレンダーを使用して、テンプレートが新しいデータをレンダリングするたびにアクションを実行します。それは正しく機能します...それがあまりにも正しく機能することを除いて。データが追加または削除されない限り、起動しません。

次に、最初の「問題」と戦うために、カスタムの「更新」を作成し、データが変更されたかどうかを検出する必要があると考えました。これも理にかなっていますが、マッピングの更新関数も「データが追加または削除された場合にのみ実行する」という考え方に従っていることに気付きました。

そこで、次のようなマッピングモデルの特定のプロパティを更新する必要があると考えました。

var dataMappingOptions = {
    key: function(data) {
        return data.id;        
    },
    create: function(options) {
        return new Person(options.data);
    },
    update: function(options) {
        // if first changed, doSomething();
        return options.target;
    },
    'first': {
        update: function(options) {
            // if first changed, doSomething();
            return options.target.first;
        }
    }   
};

しかし、それはまったくの混乱に変わり、機能すらしません。

チェックアウトしたい場合は、こちらがFIDDLEです。

簡単に言えば、プロパティが更新されているときに、プロパティをサブスクライブする方法があるはずだと確信していますか?多分あなたは計算されたオブザーバブルを作らなければならないのだろうか?私はこれをあちこちに投げて、ライアンがすでに何度も持っているので、ライアンが私に教えたいかどうかを確認します:)

4

1 に答える 1

2

あなたが達成しようとしている何か違うことがあるかどうかを説明することができるかもしれませんが、これが私がそれにアプローチする方法です:

手動サブスクリプションを使用してfirstName、そこでアクションを実行します。このサブスクリプションをPersonコンストラクターで設定します。

何かのようなもの:

var Person = function(data) {
    this.id = data.id;
    this.first = ko.observable(data.first);
    this.last = ko.observable(data.last);
    this.full = ko.computed(function() {
        return this.first() + " " + this.last();
    }, this);    
    this.first.subscribe(function(newValue) {
         alert(this.full() + " had his/her first name changed");
    }, this);        
};

このサンプルのようになります:http://jsfiddle.net/rniemeyer/EDC7q/

これで十分でしょうか?値が変わったときにどのような行動を取りたいですか?

于 2012-04-14T00:17:45.937 に答える