具有瞬态的Ember路由器

时间:2012-10-01 16:08:54

标签: ember.js ember-old-router

灵感来自Emberjs: Conditional redirect in router我以为我可以在Ember路由器中使用瞬态状态,因为这就是该问题中的“索引”路径 - 它被输入并立即转换到另一个状态而没有触发它的新事件

我可以使用以下代码(动作触发transitionTwice)获得所需的效果,但是URL以相反的顺序更新,使其保持在第一个状态,即使App以正确的顺序遍历状态结束在预期的最后状态。

App.Router = Ember.Router.extend({
    enableLogging: true,

    root: Ember.Route.extend({

        transitionTwice:  Ember.Route.transitionTo('twiceStep1'),

        index: Ember.Route.extend({
            route: '/',
        }),

        twiceStep1: Ember.Route.extend({
            route: '/twiceStep1',

            connectOutlets: function (router) {
                router.transitionTo('twiceStep2');
            }
        }),
        twiceStep2: Ember.Route.extend({
            route: '/twiceStep2',
        })
    })
}),
App.initialize();

控制台输出显示正确的状态更改:

STATEMANAGER: Sending event 'transitionTwice' to state root.
STATEMANAGER: Entering root.twiceStep1
STATEMANAGER: Entering root.twiceStep2

但是,URL最终会出现在:

...test2.html#/twiceStep1

任何人都可以发现我做错的事吗?

谢谢, 乔恩。

1 个答案:

答案 0 :(得分:1)

通过在transitionTo()中包含第二个Ember.run.next()来电,我已经能够成功实现此功能。

Ember.run.next(function () {
    router.transitionTo('twiceStep2');
});

问题是,对于任何转换,在<{em> connectOutlets()调用完成后,会更新URL。这意味着从transitionTo嵌套到connectOutlets的链式调用,并且随着调用的完成,URL将以相反的顺序更新。

虽然这解决了我的直接问题,但我不确定这是否真的构成问题的最终答案,因为这意味着最终状态需要知道它将从之前的瞬态进入 - 这不是'好分离。但是我想我应该记录下来以防其他人在这种异常情况下挣扎。