0

ノックアウト計算オブザーバブル関数と toJSON 関数に問題があります。Fiddle Exampleを作成しました。この例では、私はモデルを持っています:

function VM()
{
  this.Name = ko.observable("Tom");
  this.Age = ko.observable(23);
  
  //I want this computed evaluate only 
  //when name will change. So i put Name observable 
  //inside it.
  ko.computed(function(){
     this.Name();
    //send only after dom is initiallized
     if(initialized){   
        Server.Sync(this);
     }
  }, this).extend({ throttle: 500 });
}

function Server()
{
}

Server.Sync = function(data)
{
  alert("send");
  var jsonData = ko.toJSON(data); //This is the problamatic code which.. 
  //increases the computed dependency. After executing this code the..
  //computed function is now evaluates on Age also which i do not want.
  
  //send jsonData
};

このモデルでは、ユーザーが Name observable プロパティを変更した場合にのみ、計算された評価が必要です。Server.Sync関数が実行されるまでは正常に動作します。Sync関数では、 toJSON関数を介して ViewModel オブジェクトから JSON オブジェクトを作成しています。このコードは最初にオブザーバブルをアンラップし、 Stringify を介して JSON を作成するよりもクリーンな Js オブジェクトを作成します。ここで、オブザーバブルをアンラップしているときに、計算されたオブザーバブルの Age オブザーバブルの依存関係が増加し、ユーザーが Age プロパティを変更するたびに評価していると思います。

私の解釈が正しい場合、どうすればこれを回避できますか?

4

1 に答える 1

2

問題は「this」変数です。計算されたメインビューモデルにアクセスしています。参照が渡され、それが変更されると、計算された値が再評価されます。

あなたの最善の策は、このようなことをすることです。

渡すデータを含むローカル変数を作成し、それを渡して同期します。

これがあなたのフィドルから更新されたJSBinです。これを計算から削除し、ローカル変数を使用してアクセスしました。

http://jsbin.com/eqejov/9/edit

function VM()
{
  var self = this;
  self.Name = ko.observable("Tom");
    self.Age = ko.observable(23);

var localValue = {
   Name: self.Name(),
   Age: self.Age()
};

    //I want this computed evaluate only 
    //when name will change. So i put Name observable 
    //inside it.
    ko.computed(function(){
       self.Name();
      //send only after dom is initiallized
       if(initialized){   
          Server.Sync(localVariable);
       }
    }).extend({ throttle: 500 });
  }
于 2013-03-08T21:15:28.373 に答える