emberjs为一条路线使用多个路径/网址

时间:2014-07-24 00:13:51

标签: javascript url ember.js routes views

在恩伯我可以用这个:

App.Router.map(function() {
    this.route('accomodations');
});

所以,如果进入/住宿,它将加载该视图。

我还可以添加:

App.Router.map(function() {
    this.route('accomodations', { path: '/travel' });
});

所以,如果进入/旅行,它将进入相同的视图。

我希望能够/住宿和/旅行去同一个视图吗?这有可能吗?

我知道这个:

App.Router.map(function() {
    this.route('accomodations');
    this.route('accomodations', { path: '/travel' });
});

我会做什么,但如果他们去住宿,它应该显示在网址中,它总是显示旅行。我甚至不确定最后一段代码是否是最佳实践。

2 个答案:

答案 0 :(得分:5)

您可以简单地交换两个路径路径定义行:

App.Router.map(function() {

     this.route('accomodations', { path: '/travel' });
     this.route('accomodations');
});

最后一个定义优先考虑{{link-to ...'accomodations'}}Route#transitionTo('accomodations')应用内转换中的网址显示,但是通过' / travel'进入应用程序将保留原样的URL。 ( EmberJS 1.11.3,2.12.2)

答案 1 :(得分:1)

使用重定向

router.js

App.Router.map(function() {
    this.route('accomodations');
    this.route('travel');
});

routes/travel.js

App.TravelRoute = Ember.Route.extend({
    redirect: function() {
        this.transitionTo('accomodations');
    },
});

您不必将这些文件放在单独的文件中(这就是我要放在哪里)。

这样做是用路由器注册两条路由。选择其中一个作为"主要"路线,另一个"别名"路线。在这种情况下,accomodation是主要路由,travel是其别名。当用户访问/travel时,他们会被重定向到/accomodation

这将是默认/标准的Ember方式来实现这一点,如果这听起来不错,那就去吧。

另一种可能的解决方案

如果您不希望重定向发生,由于某种原因,并希望用户看到的URL保持不变,但仍然显示相同的内容,并且行为方式相同,这也是可能的。

在这种情况下,您将创建每个Ember单元中的两个(路径,控制器,视图,模板)。聪明的方法是创建一个基类路由,让App.TravelRouteApp.AccomodationRoute平均扩展它;创建一个基类控制器,让App.TravelControllerApp.AccomodationController平均扩展它;对于观点也是如此,如果你有的话。

模板,OTOH,有点棘手,因为没有办法扩展它们(我知道)。那么你需要做的是创建一个部分或一个组件(决定哪个更适合你),然后在templates/accomodation.hbstemplates/travel.hbs中重用那个部分/组件