在我的应用程序中,我有一个整体控制器来管理应用程序的一部分状态,称为SimpleSearch
。
在SimpleSearch
内,我有多个SimpleSearchOption
,它会向用户显示一系列选项。
用户可以选择一个选项,该选择是从视图调用的一个操作,该操作会冒泡到SimpleSearchOptionController
:
App.SimpleSearchOptionController = Ember.ObjectController.extend({
//....
select: function (option) {
option.queryName = this.get('queryName');
this.get('simpleSearch').setSelection(option);
this.set('selectedOption', option);
this.set('hasSelectedOption', true);
this.send('transitionToNextOption');
},
//....
此操作会调用this.get('simpleSearch').setSelection(option);
,使用SimpleSearchController
注册选择:
App.SimpleSearchController = Ember.ObjectController.extend({
//....
setSelection: function (option) {
this.set(option.queryName, option.value);
this.get('selectedOptions').set(option.queryName, option.value);
this.get('model').notifyPropertyChange('selectedOptions');
this.checkIfAllOptionsSelected();
},
//....
其中重要的一行是:this.set(option.queryName, option.value);
。
注册选择后,它将移至下一个选项,如果没有,则跳转到搜索结果。这是从this.send('transitionToNextOption');
App.SimpleSearchOptionController = Ember.ObjectController.extend({
//....
transitionToNextOption: function () {
var nextOptionId = parseInt(this.get("id")) + 1;
var numOfOptions = this.get('simpleSearch.numOfOptions');
if (nextOptionId < numOfOptions) {
this.transitionToRoute('simpleSearchOption', nextOptionId);
}
else {
this.transitionToRoute('simpleSearchResults');
}
},
//....
在上面的setSelection()
中,行this.set(option.queryName, option.value);
正在设置查询参数的值。这只能正常工作,并且所有选项都会相应地更新网址,当我没有转换到其他路径时。
如果我注释掉这些话:
else {
this.transitionToRoute('simpleSearchResults');
}
设置属性(this.set(option.queryName, option.value);
)实际上有Ember的副作用更新URL中的查询参数,这是我的意图。如果我包含该行,并在设置该变量后转换到其他路径,则不会更新查询参数。
我正在逐步介绍Ember的代码,但我无法完全理解它是如何处理这个问题的。它继续进入_doTransition()
,我注意到,在传递queryParams之前,路由'simpleSearchResults'的转换总是发生。
如何让Ember在转换为'simpleSearchResults'之前更新查询参数?
感谢您的帮助。
答案 0 :(得分:0)
我通过将转换包装在Ember.run.next()
函数中解决了我的问题:
transitionToNextOption: function () {
var nextOptionId = parseInt(this.get("id")) + 1;
var numOfOptions = this.get('simpleSearch.numOfOptions');
if (nextOptionId < numOfOptions) {
this.transitionToRoute('simpleSearchOption', nextOptionId);
}
else {
var self = this;
Ember.run.next(function() { self.transitionToRoute('simpleSearchResults'); });
}
},
我假设,但尚未验证,Ember正在排队转换为'simpleSearchResults'的操作,并且类似地处理查询参数。也许转换到不同的路径会以某种方式中断或覆盖正在写入URL的查询参数。