为什么这个 Emberjs 控制器不能设置密钥



下面是一个简化的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);
  }
});

这一切都是关于异步的

当您调用方法this时,正如您已经注意到的那样,它正确地引用了控制器,这就是为什么您可以使用this.get('someValue'),但当ayncronus调用返回时(例如调用了wenn done),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', '');
  }
});

更新以回应您的上一条评论

我不知道你有什么不同的做法,但看看这个简单的Demo,它可以像预期的那样工作。单击"某些操作"按钮以执行请求。

希望能有所帮助。

因为jqxhr.done中的this不引用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

最新更新