1

ノックアウト js を使用してさまざまなイベントを処理しています。そのうちの 1 つは、価格入力フィールドに千の区切り記号を追加することです。

だから私は価格フィールドに変更イベントをサブスクライブし、不足している区切り記号を追加して価格フィールドに書き戻す魔法を行います。価格フィールドへの書き戻しは新しい変更イベントをトリガーするため、ループを中断するためのチェックが必要です。これは、値が実際に変更されたかどうかを確認することによって行います。

    this.listingPriceFormatted.subscribe(function (newValue, model) {
        var cleanValue = newValue.toString().replace(/\D/g, '');
        $('#Price').val(cleanValue);
        var outValue = MySite.Utilities.addThousandSeperator(cleanValue);
        if (newValue != outValue) {
            me.listingPriceFormatted(outValue);
        }
    });

値を 1 回設定するためだけに同じイベントを 2 回トリガーするのはあまり好きではありません。イベントを再度トリガーせずにフィールドに書き戻す方法はありますか、それとも間違っていますか?

4

1 に答える 1

3

この場合、書き込み可能なdependentObservableにバインドすることは、おそらくその仕事に適したツールです。これにより、フィールドの読み取りと設定の方法を制御できます。

たとえば、listingPrice observableがある場合、listingPriceFormattedwriteabledependentObservableを持つことができます。フィールドをlistingPriceFormattedにバインドします。次のようになります。

viewModel.listingPriceFormatted = ko.dependentObservable({ 
   read: function() { 
               //add commas
               return MySite.Utilities.addThousandSeperator(this.listingPrice());
          },
   write: function(newValue) {
              //strip commas and store in listingPrice
              this.listingPrice(MySite.Utilities.stripThousandSeperator(newValue));
          }
   }, viewModel);

この機能は1.12以降に追加されたため、GitHubからのコードの新しいコピーを使用する必要があります。お役に立てれば。

また、この投稿の最後に、observableとdependentObservableを1つのオブジェクトにカプセル化するためのアイデアがあります。http ://www.knockmeout.net/2011/03/guard-your-model-accept-または-cancel-edits.html

于 2011-03-09T15:12:39.557 に答える