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