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);

这里的另一个问题是您正在使用 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());
});

当您创建一个可能会改变的变量时,您必须将其创建为可观察的。observable 实际上是您调用的函数。当被调用时,它将更新其内部值,并且它还将在可观察对象被“观察到”的任何地方触发任何更改

你绝不应该尝试去做this.x = 5。它将覆盖实际的可观察对象,因此它永远不会触发每个观察者的变化。

编辑

如果您有兴趣了解计算的工作原理。计算变量是一个listen可以观察到的函数。当它computed被创建时,它会被调用一次以检查从它内部调用了哪些 observables。这是一种“跟踪”依赖关系的方法。在此示例中,您应该看到至少两个控制台日志。一个加 1,然后加 5。

就我而言,计算变量是一种匿名的,因为它在任何地方都不会受到影响。同样在某些情况下,您可能需要观察一个变量但使用多个可观察对象。防止更新任何其他使用的 observables。有一些方法可以做到这一点。您可以在“观看”所需的 observables 后返回。

或者您可以创建一个子函数,该函数将在用 计算后触发一点setTimeout(..., 0);。有几种方法可以实现一些非常好的技巧。

于 2013-02-26T21:29:41.647 回答