如何从URL确定Ember路由名称?

时间:2016-06-06 22:04:44

标签: ember.js

我需要从URL字符串确定路由名称。

这通常是路由器在内部完成的工作,但由于{insert long story here},我需要手动完成。我从API获得了一个看起来像'gallery / 123'的数据,我需要知道路由名称是'gallery.post'。这样我就可以route.replaceWith(determinedRouteName);

  • 需要将'gallery / 123'变成'gallery.post'
  • 需要将'stuff / 99 / comments'变成'stuff.post.comments'

2 个答案:

答案 0 :(得分:0)

Ember在内部依赖于router-recognizer micro lib。我认为你最好的选择就是使用它。

不幸的是,访问路由器实例当前需要依赖私有-routing服务。 (注意:这是关于提供公共路由器服务的pending RFC)。

注册此私人服务:

import Ember from 'ember';

export default Ember.Route.extend({
  router: Ember.inject.service('-routing'),

  ...
});

如果您想构建完整的字符串或其他任何内容,recognize函数将返回您可以加入的所有处理程序的列表。

例如:

this.router.recognize("stuffs/99/comments");
> [{handler: "application", ...}, 
    handler: "stuffs", ...}, 
    handler: "stuff", ...}, 
    handler: "comments", ...}, 
    handler: "comments.index, ...}]

希望有所帮助

答案 1 :(得分:-1)

您是否总是在路线中只有一个身份证?或者,第一个ID始终是' post'身份证号码至少?如果是这样的话,这不是一个真正的Ember问题,它只是一个JavaScript查找/替换,它始终遵循相同的格式,假设API数据总是以相同的格式返回。

假设API始终提供以下格式:

"东西/的:POST_ID / optionally_something_else"

您可以获取API提供的字符串,并通过几个替换方法运行它:

var apiString = "stuff/99/comments";

apiString = apiString.replace(/[0-9]+/, "post").replace(/\//g, "."); // => "stuff.post.comments"

// Also works with:

var apiString = "gallery/123";

apiString = apiString.replace(/[0-9]+/, "post").replace(/\//g, "."); // => "gallery.post"

免责声明:这很糟糕,如果字符串不遵循此格式,则会中断。它也只会将第一个数字集转换为" post"。但像往常一样,如果你必须使用它:P