Emberjs为一条路由使用多个路径/ url

emberjs using multiple paths / urls for one route

本文关键字:路径 url 一条 一条路 路由 Emberjs      更新时间:2023-09-26

在Ember我可以使用这个:

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

所以如果有人去/accommodation它会加载那个视图

我还可以加上:

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

所以如果一个人去/travel,它会去同一个视图

我想要/住宿和/旅行去同一个景点?这可能吗?

我知道这个:

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

会按照我的要求去做,但如果他们去住宿,它应该在url中显示,它总是显示旅行。我甚至不确定最后一段代码是否是最佳实践。

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

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

最后一个定义在{{link-to ...'accomodations'}}Route#transitionTo('accomodations')的应用内转换中优先显示URL,尽管通过'/travel'输入应用将保留URL。(EmberJS 1.11.3, 2.12.2)

使用重定向

In router.js

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

In routes/travel.js

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

你不必把它们放在单独的文件中(这正是我要把它们放在的地方)。

的作用是向路由器注册两条路由。选择其中一条作为"主"路线,另一条作为"别名"路线。在本例中,accomodation是主路由,travel是它的别名。当用户访问/travel时,他们被重定向到/accomodation

这将是默认的/标准的烬完成这一点的方式,如果这听起来不错,就这样做吧。

另一种可能的解决方案

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

在本例中,您将为每个Ember单元(路由、控制器、视图、模板)创建两个。聪明的方法是创建一个基类路由,并让App.TravelRouteApp.AccomodationRoute简单地扩展它;创建一个基类控制器,并有App.TravelControllerApp.AccomodationController平凡地扩展它;视图也一样,如果你有的话。

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