3

我目前正在测试Ember.Router,我想知道如何在匹配特定条件时限制对某些特定路由的访问。在我的示例中,我正在使用结帐流程,其中必须先设置帐单地址,然后用户才能继续使用帐单方式等(例如:帐单方式视图需要知道帐单国家/地区以提供其允许的付款方式)。

在我的尝试中,我试图验证模型(序列化:函数()或输入:函数()?),当未设置给定值时,路由器应重定向到以前的状态(必须这样做一点超时,否则哈希将无法正确更新)。

这是我的示例代码

http://jsfiddle.net/mediastuttgart/uMKGt/

编辑:

找到汤姆戴尔的一些话,虽然与这个问题无关,但仍然是一个很好的答案:“状态的全部意义在于避免这种情况......处理它们是当前状态的责任。”。

参看。http://github.com/emberjs/ember.js/issues/745

嗯,这是有道理的。

编辑2:

尽管在 location 方法设置为“null”时这是有道理的。当使用 'hash' 或 'history' 来处理位置状态并且用户在比 /index 更深的路由上重新加载页面时 - 当前路由必须验证值,然后如果某个条件不匹配,则最终重定向到前一个(而确实验证属于前一条路线)。

长话短说,当前的路由验证应该依赖于前一个,并且应该重定向到满足所有条件的状态。

相反的顺序:

  • 运输方式?(/#/delivery/method) 不->
  • 计费方式?(/#/billing/method) 不->
  • 邮寄地址?(/#/delivery/address) 不->
  • 帐单地址 - (/#/billing/address) 请从这里开始。

期待看到一些 EmberJS 的人来解决问题:)

4

1 回答 1

2

我一直在做同样的事情。我认为你在正确的轨道上,汤姆关于整个州的引述确实触及了它的核心。路由器变化很快,所以不确定这里是否有既定的模式,但我可以分享我迄今为止学到的东西。

总结一般问题:Ember 路由器使用 url 来序列化/反序列化应用程序状态。除了知道请求的路由之外,它是无状态的。最终用户可以完全控制这个状态,并且可以通过输入一个 url 在任何状态下重新加载应用程序。因此,在给定用户权限和模型当前状态的情况下,所有应用程序都会遇到一个常见问题,即何时/如何验证请求的状态是否“有效”。

来自 Rails,我的第一直觉是像在之前的过滤器中一样保护路由。这在 Ember 中很棘手 - 由于数据加载是异步的,因此在初始下降到路由层次结构期间它不可用。我自己还没有得到这种方法,但其他人有。典型的方法似乎是

  • 使用 sproutcore 状态图,它允许并发状态 (SinisterMinister)
  • 中途暂停状态转换,等待数据加载(lukemelia 建议)
  • 在早期版本的 Ember 路由器中,您可以将标记转换用作异步,但已被删除

鉴于汤姆对州的看法,我会尽可能避免这种情况。与其尝试“保护”路由,不如使用路由+状态的组合来确保用户一开始就无法达到无效状态。在您的示例中,您将更改为:

  • '/billing' 处的单个“可路由”状态
  • 2 个名为 'method' 和 'address' 的“子状态”(这些应该扩展 Ember.State 而不是 Ember.Router 并且不设置路由)
  • '/billing' 路由的初始状态将是 'address'
  • 当 BillingAddressModel 更改(通过用户操作或异步数据加载)时 router.send('billingAddressUpdated')
  • billingAddressUpdated 事件在“方法”和“地址”子状态之间适当转换

顺便说一句,对于这种方法,您需要使用 HEAD ember,因为没有路由的子状态在最近提交之前被破坏。

非常想知道其他人如何解决这个问题。希望这可以帮助。

于 2012-06-27T16:34:46.723 回答