2013-01-14 89 views
2

我试图将我的应用迁移到新的emberjs路由API。Emberjs新的路由和查询字符串或自定义路由匹配器

使用旧路由器我有一些解决方法,为由ID保存的对象和通过一组参数描述的新对象提供类似的URI。这是为了在用户之间交换链接到对象的能力而没有永久保存它。这是从我的应用的两种简化有效的途径:

/objects/12     // fetch object by id (/objects/:object_id) 
/objects/<serialized params> // build new object from params (/objects/:params) 

此路线的两个类似于路由器,因为它们都具有动态部分和静态部分是相等的。所以我写了自定义RouteMatcher以拾取正确的路线。缺乏查询字符串解析迫使我做这个快速和半解法的解决方案,也有关于github上的这个功能的ancient ticket

随着新的路由器匹配已被提取到单独的包(路由识别器),所以我不能做的伎俩(或它将充满黑客和注入)。

我可以看到我已经从这些选项中进行选择:

  • 完全重写我的URI和独立的所有交叉路线
  • 重写的URI,但试图实现查询字符串分析器新Ember.Router
  • 将所有逻辑成一条路由并重新实现只序列化/反序列化方法(脏东西)

二的解决方案似乎更干净。

什么是最好的非复杂的决定?我应该尝试寻找另一种方式吗?

+0

覆盖路线的模型方法并没有诀窍? – zaplitny

+0

这是选项#3。当然,它会做,但休息部分路线是略有不同的保存和新的对象,所以逻辑会搞砸。 – konung

回答

5

当前路由器不支持查询字符串参数。

我们正在跟踪这个错误https://github.com/emberjs/ember.js/issues/1773。你可能想要关注它。

与此同时,您最好的选择可能是使用动态段并手动序列化(使用serialize钩子)和反序列化(使用model钩子)。

+0

谢谢你的回复。我会尝试使用这个解决方案。看来我需要简化所有路线的逻辑。还有可能将静态路由放在与动态相同的级别上? – konung

+0

您可以将静态和动态路由置于同一级别。如果静态路由和动态路由都匹配,则静态路由将获胜。这样'/ posts/new'胜过'/ posts /:post_id'。 –

+0

好的。继续调查。 – konung