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

时间:2013-08-13 05:13:21

标签: ember.js

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

2 个答案:

答案 0 :(得分:0)

由于this中的jqxhr.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

答案 1 :(得分:0)

这都是关于异步的。

当你调用方法时this正确引用你已经注意到的控制器,这就是为什么你可以使用this.get('someValue'),但是当同步调用返回时(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,它按预期工作。单击“Some action”按钮执行请求。

希望它有所帮助。