0

下面是一个简化的 Ember 控制器。jQuery 用于进行远程调用,需要在回调中的控制器中执行操作。

在回调中,this正确引用了 GenericController,我可以读取一个值this.get('someKey')this.set('someKey', '')不会设置该值。这在this.transitionTo方法被删除时有效。任何关于如何让布景与过渡礼物一起工作的帮助都会非常有帮助。

App.GenericController = Ember.Controller.extend({
  someAction: function() {
    var jqxhr = jQuery.getJSON(this._endpoint, {someKey: this.get('someKey')});
    jqxhr.done(this._someActionComplete.bind(this));
  },

  _endpoint: '/some/generic.json',

  _someActionComplete: function(json, textStatus, jqxhr) {
    this.set('someKey', '');
    this.transitionToRoute('reference', reference);
  }
});
4

2 回答 2

0

因为thisinjqxhr.done不引用GenericController,所以它引用了调用的对象done。这就是我解决它的方法:

App.GenericController = Ember.Controller.extend({

  someAction: function() {
  var self = this;
    var jqxhr = jQuery.getJSON(this._endpoint, {someKey: this.get('someKey')});
    jqxhr.done(self._someActionComplete.bind(self));
  }
}

现在您仍然有一个引用,this您可以使用它来调用set控制器上的其他函数,包括 。

于 2013-08-13T06:36:03.003 回答
0

都是关于异步的。

当您调用您的方法this正确引用您已经注意到的控制器时,这就是您可以使用的原因this.get('someValue'),但是当 ayncronous 调用返回时(done例如调用 wenn)this不再引用您的控制器,而是调用该done函数的对象,所以你必须在发出请求之前保护正确的引用this,这样你就可以使用它将它传递给bind函数:

App.GenericController = Ember.Controller.extend({
  someAction: function() {
    var _this = this;
    var jqxhr = jQuery.getJSON(this._endpoint, {someKey: this.get('someKey')});
    jqxhr.done(_this._someActionComplete(_this));
  },

  _endpoint: '/some/generic.json',

  _someActionComplete: function(json, textStatus, jqxhr) {
    this.set('someKey', '');
  }
});

更新以响应您的最后评论

我不知道您在做什么不同,但请看一下这个简单的演示,它可以按预期工作。单击“某些操作”按钮以执行请求。

希望能帮助到你。

于 2013-08-13T07:07:39.083 回答