获取Ember.js中的路线列表

时间:2015-02-02 08:55:08

标签: javascript ember.js

在我的主页面(index.hbs)上,我需要显示每条路线的链接列表,这些链接符合给定的标准(例如,具有某个属性)。所以我需要的是这样的东西:

// Define a route with some attribute
App.FirstRoute = Ember.Route.extend({
    showOnIndex: true
});

// Get a list of visible routes in the IndexController
visibleRoutes: function() {
    var routes = /* How to do this */
    return routes.filter(function(route) {
        route.get('showOnIndex'));
    });
}.property()

问题是如何获得routes。我发现我可以通过以下方式获得路线名称列表:

var router = this.get('target');
var names = router.router.recognizer.names;

但我无法了解如何将它们转换为Route个对象。据推测,Router有信息可以这样做,但AFAICS并没有公开曝光。有什么建议?

2 个答案:

答案 0 :(得分:1)

这是一种方法,虽然我觉得它有点可怕,甚至可能长期危险,因为它使用的是Javascript而不是Ember API的功能。我们首先通过“App”对象获取路线。您可以使用Object.keys(App)获取它包含的所有类的列表。然后你可以浏览每一个,检查它是否是一个带有.superclass的路由,如果它是一个路由,它将是Ember.Route。然后,您可以检查每个原型的showOnIndex属性。

var allRoutes = [];
Object.keys(App).forEach(function(key, index, allKeys) {
    if (App[key].superclass === Ember.Route && App[key].prototype.showOnIndex === true) {
        allRoutes.push(App[key]);    
    }
});

我们现在有一个showOnIndex为true的路由的所有类名的数组。

但是,您仍然存在将识别器中的名称与Route的类名对齐的问题,但由于Ember方式是像my / url这样的路径将映射到MyUrlIndexRoute和'my.url.index'等然后你可以用大写分割Route,删除最后一部分('Route'),将它们连接在一起并将它们全部转换为小写。

var routesByName = [];
allRoutes.forEach(function(name, index, all) {
    var names = name.match(/[A-Z][a-z]+/g);
    names.pop();
    var routeName = names.join('.').toLowerCase();
    routesByName.push(routeName);
});

然后你可以循环遍历模板中的routesByName并为每个中的每个创建{{#link-to}}

我认为实现目标的更好方法可能是在应用程序内单独保留所有路径到他们的showOnIndex值的地图,并为每个要添加的新路径更新它。从长远来看,这可能会更安全,因为谁知道Ember内部将来会如何改变,这可能会阻止上述某些事情发生。

请注意,我在Chrome中的Ember应用程序中以调试器模式检查了所有这些,但没有直接运行所有代码片段,因此对任何错误表示道歉。

答案 1 :(得分:1)

使用容器和查找怎么办?

Ember.keys(App.Router.router.recognizer.names).map(function(name) {
  return App.__container__.lookup('route:' + name);
}).compact();

我知道您访问了私有的__container__。但通常你不应该访问所有的路线。