1

「これ」の問題があり、助けていただければ幸いです

これは私の基本的なコードです

function xxx(val)
{
   this.x = val;
   this.change = function() {
     var self = this;
     $.ajax({
         blah: '',
         blah: '',
         success: function(data) { self.x = 5; },
     });
   };
}

var newX = new x(1);
newX.change();

console.log(newX.x);

うまくいけば、それは理にかなっている、

私がやろうとしているのは、jquery ajax 応答で元のオブジェクトを更新することです。「this」にアクセスできないため、「self」変数に渡そうとしましたが、コードが期待どおりに実行されているにもかかわらず、オブジェクトの値が更新されていないようです。

簡単な答えがあると確信しています。私はそれを知りません。

どんな助けでも大歓迎です。

4

2 に答える 2

3

したがって、これを解決する方法は、関数宣言を確認することです。各関数宣言は、新しいthisオブジェクトを提供します。興味のあるものを正しい場所に保管してください。私が正しければ、実際には元の xxx 関数スコープのスコープにアクセスしたいようです。したがってthischange関数に格納する代わりに、元のスコープのそれより上に格納します。このようなもの:

function xxx(val)
{
   var self = this;

   this.x = val;

   this.change = function() {
     var that = this;
     $.ajax({
         blah: '',
         blah: '',
         success: function(data) { self.x = 5; },
     });
   };
}

var newX = new x(1);
newX.change();

console.log(newX.x);

ここでのもう1つの問題は、AJAXを使用してその呼び出しを行っているため、Deferredオブジェクトが必要になるか、次のように適切なタイミングでトリガーされるその関数にコールバックを追加できることです。

   function xxx(val)
        {
           var self = this;

           this.x = val;

           this.change = function(callback) {
             var that = this;
             $.ajax({
                 blah: '',
                 blah: '',
                 success: function(data) { 
                      self.x = 5;
                      if (typeof callback === "function"){
                            callback.call(this);
                      }
                 }
             });
           };
        }


    var newX = new xxx(1);

    newX.change(function(){
        console.log(newX.x);
    });
于 2013-02-26T21:18:47.507 に答える
2

ノックアウトでは...次のようなことをする必要があります:

function Xxx(val)
{
   var self = this;

   this.x = ko.observable(val);

   this.change = function() {
     // "that" may be different to "self" in some
     // cases...
     var that = this;
     $.ajax({
         url: '...',
         type: 'get',
         success: function(data) {
             self.x(5);
         },
         error: function(a) {
             console.log('got an error');
         }
     });
   };
}

var newX = new Xxx(1);
newX.change();

ko.computed(function () {
    // This will get called everytime
    // newX.x is changed
    console.log(newX.x());
});

変更される可能性のある変数を作成するときは、それをオブザーバブルとして作成する必要があります。オブザーバブルは、実際には呼び出す関数です。呼び出されると、その内部値が更新され、オブザーバブルが「観察」されている場所であればどこでも変更がトリガーされます。

決してやろうとすべきではありませんthis.x = 5。実際の監視可能なオブジェクトをオーバーライドするため、変更のすべてのオブザーバーをトリガーすることはありません。

編集

計算がどのように機能するかを理解することに興味がある場合。計算された変数は、listenオブザーバブルを処理する関数です。が作成されると、そのcomputed中からどのオブザーバブルが呼び出されたかを確認するために一度呼び出されます。これは、依存関係を「追跡」する方法です。この例では、少なくとも 2 つのコンソール ログが表示されます。1 で 1 つ、次に 5 で。

私の場合、計算された変数はどこにも影響を受けないため、匿名のようなものです。また、場合によっては、1 つの変数を監視する必要がありますが、複数の監視対象を使用する必要があります。他の使用済みオブザーバブルの更新を防ぐため。それにはいくつかの方法があります。必要なオブザーバブルを「見た」後に戻ることができます。

または、で計算された少し後にトリガーされるサブ関数を作成できますsetTimeout(..., 0);。本当に素晴らしいトリックを実現するには、いくつかの方法があります。

于 2013-02-26T21:29:41.647 に答える