紧接着调用transitionToRoute()时,Ember不更新查询参数

时间:2014-03-10 18:13:54

标签: ember.js

在我的应用程序中,我有一个整体控制器来管理应用程序的一部分状态,称为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'之前更新查询参数?

感谢您的帮助。

1 个答案:

答案 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的查询参数。