我正在测试Ember.Router
,我想知道如何在匹配某个条件时限制对某些特定路线的访问。在我的示例中,我正在玩结帐流程,其中必须先设置帐单邮寄地址,然后用户才能继续使用结算方式等等(例如:结算方式视图需要知道结算国家/地区以提供其允许的付款方式)。
在我的尝试中,我正在尝试验证模型(serialize:function()或者输入:function()?),当没有设置给定值时,路由器应该重定向到以前的状态(必须使用一点超时执行此操作,否则哈希将无法正确更新。
这是我的示例代码
的小提琴http://jsfiddle.net/mediastuttgart/uMKGt/
修改
找到汤姆戴尔的一些话,虽然与这个问题没有关系,但仍然是一个很好的答案:“国家的整个观点是避免这样的情况......当前国家有责任处理它们。”
比照http://github.com/emberjs/ember.js/issues/745
这很有道理。
EDIT2:
虽然这在位置方法设置为“null”时有意义。当使用'hash'或'history'来处理位置状态并且用户在比/ index更深的路由上重新加载页面时 - 当前路由必须验证值,然后如果某个标准不匹配则最终重定向到前一个值(确实,验证属于以前的路线。)
简而言之,当前的路线验证应该取决于前一个路线,并且应该在满足所有条件时重定向到一个状态。
逆序:
期待看到一些EmberJS人员清理事情:)
答案 0 :(得分:2)
我一直在努力。我认为你走在正确的轨道上,从汤姆那里引用了整个国家的真实情况。路由器正在快速变化,所以不确定这里是否有既定的模式,但我可以分享到目前为止我学到的东西。
总结一般问题:Ember路由器使用url序列化/反序列化app状态。除了知道所要求的路线外,它是无国籍的。最终用户可以完全控制此状态,并可以通过输入URL在任何状态下重新加载应用程序。因此,在给定用户权限和模型的当前状态的情况下,所有应用程序都会遇到一个常见问题:何时/如何验证所请求的状态是否“有效”。
来自Rails,我的第一直觉是保护路线,就像我们在过滤前一样。这在Ember中很棘手 - 因为数据加载是异步的,所以在初始下降到路由层次结构期间它不可用。没有让这种方法自己工作,但其他人有。典型的方法似乎是
鉴于汤姆所说的关于各州的事情,我试图尽可能避免这种情况。不要试图“保护”路线,而是使用混合的路线+状态来确保用户首先无法达到无效状态。在您的示例中,您将更改为:
BTW你需要使用HEAD ember来实现这种方法,因为没有路由的子状态会被破坏,直到最近提交。
非常好奇了解别人如何解决这个问题。希望这会有所帮助。