限制对 Ember.js (Ember.Router) 中特定路由的访问



我目前正在测试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 余烬,因为没有路由的子状态在最近提交之前被破坏。

非常想知道其他人如何处理这个问题。希望这有帮助。

最新更新