5

現在、2 つの Knockout 拡張機能があります。1 つは Observable にメンバーを追加し、もう 1 つは読み取りおよび書き込み操作をインターセプトします。

拡張メソッドを組み合わせると、アプリケーションの順序が望ましくない影響を及ぼします。

以下の簡略化されたコード例。

ko.extenders.format = function(target) {
    var result = ko.computed(function(){
        return "$" + target();
    });

    target.formatted = result;

   return target;
};

ko.extenders.numeric = function(target, precision) {
    var result = ko.computed({
        read: function() {
            var current = parseFloat(target());
           return current.toFixed(precision);
        },
        write: function(newValue) {
            newValue = parseFloat(newValue);
            target(newValue.toFixed(precision));
        }
    });

    return result;
};

数値メソッドでは、フォーマットされたメンバーをチェックして新しい計算に割り当てることができますが、他のメソッドの知識を与えたくありません。オブザーバブルまたは拡張機能からさらにメンバーを追加することにした場合、これも維持できなくなります。

if(target.hasOwnProperty("formatted")){
    result.formatted = target.formatted;
}

hasOwnProperty 修正なしのフィドルです。 http://jsfiddle.net/gs5JM/2/

拡張アプリケーションの順序とフォーマットされたメンバーの損失により、MyValue4 - Format: が空白になっていることに注意してください。

同じ最終結果を達成し、コードをより柔軟にするためのより良いパターンはありますか?

4

1 に答える 1

1

問題は、formatエクステンダーが元のオブザーバブルを参照しnumeric、新しいオブザーバブルを作成することです。したがってformatnumericまったく異なるオブザーバブルを操作します。どちらの場合も、元のオブザーバブルを返すことを検討する必要があるようです。

numeric私はあなたをこのように書き直します:

ko.extenders.numeric = function(target, precision) {

    ko.computed(function(){
        var current = parseFloat(target());
        target(isNaN(current) ? 0 : current.toFixed(precision));
    });

    return target;
};

Anonymousは、即時評価で値の変更computedへのサブスクリプションを作成します。target評価関数は、値を解析し、正確な数値をターゲット オブザーバブルに再割り当てしようとします。

http://jsfiddle.net/gs5JM/3/

注: KO は既に を評価している間は再評価しないため、循環依存の可能性について気にする必要はありませんcomputed

于 2013-10-22T06:23:58.993 に答える