下面是一个简化的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);
}
});
答案 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”按钮执行请求。
希望它有所帮助。