0

Knockout2.0およびMVC3Razorフォームを使用して、ajaxメソッドを導入したときに、依存する観察可能な作業を行うことができません。計算の一部であるオブザーバブルのセットを設定しました。これらのオブザーバブルの積を返すと、正しい結果でSPANタグを設定できます。ただし、ajaxメソッドを使用してこれらのオブザーバブルを処理し、結果を返そうとすると、予期しない動作が発生します。まず、INPUTフィールドが更新されたときにajax POSTがオブザーバブルの1つを取得しないようです(アクションメソッドへのvar b POSTは0ですが、最終的には更新されます)。その後、設定できないようです。正しく評価された場合でも結果。オブザーバブルまたはajax呼び出しのいずれかにタイミングの問題があるようです。javascriptで計算を実行し続けるだけでも問題なく機能しますが、私の意図は、より複雑なロジックのためにajaxメソッドを呼び出すことです。doc.ready()からko.applybindingsの呼び出しを削除し、SCRIPTメソッドをページの下部に移動しました。これが、これを部分的に機能させる唯一の方法でした。私のviewModelは次のように設定されています:

var viewModel = {
    a: ko.observable(0),
    b: ko.observable(1),
    c: ko.observable(2),
    // commented this out, since
    // the dependent observable will handle this
    // d: ko.observable(0)
};

私の扶養家族のオブザーバブル:

viewModel.d = ko.dependentObservable(function () {
    var theResult = 0;
    $('.theLabel').css("visibility", "visible");
    theResult=viewModel.a() * viewModel.b() * viewModel.c();
    // if we return here we get a valid result 
    return (theResult);

    // prefer to call ajax method
    // first check to ensure one variable is set
    if (viewModel.a() > 0) {
            $.ajax("/myCalculation/getResult", {
                data: ko.toJSON(viewModel),
                type: "post",
                context: viewModel,
                contentType: "application/json",
                success: function (result) {
                    // can't set visibility here
                    $('.theLabel').css("visibility", "visible");
                    // the POST does not pick up some observables, or
                    // does not the set dependent observable at all
                    return result;
                }
            });

        }
    });
4

1 に答える 1

2

設定した機能にはかなりの間違いがあります。

1.)AJAX呼び出しを行う前に関数から戻っています。returnステートメントの後のコードは実行されません。

2.)最初のreturnステートメントを省略しても、AJAX呼び出しは非同期です...これは、バックグラウンドで実行され、制御をすぐに外部スコープに戻すことを意味します。returnステートメントがないため、undefinedを返します。

3.)成功コールバックのコメントは、returnステートメントが計算されたオブザーバブルまで伝播することを期待していることを示しています。そのreturnステートメントはコールバックにのみスコープされ、外部の監視可能オブジェクトにはスコープされません。戻り値はjQueryによって使用され、observableは長い間戻ってきます。

オブザーバブルでAJAX関数を呼び出す場合は、非同期呼び出しの結果を格納するための個別の値が必要です。

簡単な例を次に示します。

var viewModel = function(){
   var $this = this;

   $this.a = ko.observable();
   $this.b = ko.observable();
   $this.results = ko.observable();

   //No need to assign this computed observable to a variable
   // because the results will be stored in '$this.results'
   // we just need this to handle the automatic updates
   ko.computed(function(){
      var data = {
         a: $this.a(),
         b: $this.b()
      };

      $.post("/do/some/stuff", data, function(results){
         $this.results(results);
      });
   });
};
于 2012-07-03T03:50:39.023 に答える