我目前正在测试Ember.Router
,我想知道如何在符合特定条件时限制对某些特定路由的访问。在我的示例中,我正在玩一个结帐流程,在该流程中,必须先设置帐单地址,然后用户才能继续使用帐单方法等(例如:帐单方式视图需要知道帐单邮寄地址以提供其允许的付款方式)。
在我的尝试中,我正在尝试验证模型(序列化:函数()或输入:函数()?),当未设置给定值时,路由器应重定向到以前的状态(必须这样做一点超时,否则哈希将无法正确更新)。
这是我的示例代码的摆弄
http://jsfiddle.net/mediastuttgart/uMKGt/
编辑:
找到了汤姆·戴尔(Tom Dale)的一些话,虽然与这个问题无关,但仍然是一个很好的答案:"国家的全部意义在于避免这种情况......处理它们是当前国家的责任。
参看 http://github.com/emberjs/ember.js/issues/745
嗯,这是有道理的。
编辑2:
尽管当位置方法设置为"null"时,这是有意义的。当使用"哈希"或"历史记录"来处理位置状态并且用户在比/index 更深的路由上重新加载页面时 - 当前路由必须验证值,然后最终重定向到前一个路由,如果某个条件不匹配(而验证确实属于以前的路由)。
长话短说,当前路由验证应依赖于前一个路由验证,并且应在满足所有条件时重定向到状态。
倒序:
- 交货方式?(/#/交付/方法) 不 ->
- 计费方式?(/#/计费/方法) 不 ->
- 送货地址?(/#/送货/地址) 不 ->
- 帐单地址 - (/#/帐单/地址) 请从这里开始。
期待看到一些EmberJS人员来解决问题:)
我一直在做同样的事情。我认为你走在正确的轨道上,汤姆关于整个国家观点的那句话确实触及了它的核心。路由器变化很快,所以不确定这里是否有既定的模式,但我可以分享我到目前为止学到的东西。
总结一般问题:Ember 路由器使用 url 序列化/反序列化应用状态。除了知道请求的路由之外,它是无状态的。最终用户可以完全控制此状态,并且可以通过输入 URL 重新加载任何状态的应用。因此,所有应用都有一个常见问题,即何时/如何验证给定用户权限和模型当前状态的请求状态是否"有效"。
来自 Rails,我的第一直觉是像在过滤器之前一样保护路线。这在 Ember 中很棘手 - 由于数据加载是异步的,因此在初始下降到路由层次结构期间不可用。我自己没有这种方法,但其他人有。典型的方法似乎是
- 使用sproutcore statechart,它允许并发状态(SinisterMinister)
- 中游暂停状态转换,等待数据加载(由 Lukemelia 建议)
- 在早期版本的 Ember 路由器中,您可以使用将转换标记为异步,但已被删除
鉴于汤姆所说的状态,我尽可能避免这种情况。与其尝试"保护"路由,不如混合使用路由 + 状态来确保用户首先无法到达无效状态。在您的示例中,您将更改为:
- "
- /计费"处的单个"可路由"状态
- 2个名为"方法"和"地址"的"子状态"(这些应该扩展Ember.State而不是Ember.Router,并且不设置路由) "
- /计费"路由的初始状态将是"地址"
- router.send('billingAddressUpdate') 当 BillingAddressModel 更改时(通过用户操作或异步数据加载)
- 计费地址根据需要更新了"方法"和"地址"子状态之间的事件转换
顺便说一句,您需要在此方法中使用 HEAD 余烬,因为没有路由的子状态在最近提交之前被破坏。
非常想知道其他人如何处理这个问题。希望这有帮助。