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

标签 javascript ember.js router

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

在我的尝试中,我试图验证模型(序列化:函数()或者输入:函数()?)并且当未设置给定值时,路由器应该重定向到以前的状态(必须稍微超时执行此操作,否则哈希将无法正确更新)。

这是我的示例代码的 fiddle

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

编辑:

找到了 tom dale 的一些话,虽然与这个问题无关,但仍然是一个很好的答案:“国家的全部意义在于避免这样的情况......当前国家有责任处理这些情况。” .

比照。 http://github.com/emberjs/ember.js/issues/745

嗯,这是有道理的。

编辑 2:

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

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

倒序:

  • 交付方式? (/#/delivery/method) 没有 ->
  • 计费方式? (/#/billing/method) 没有 ->
  • 送货地址? (/#/delivery/address) 没有 ->
  • 账单地址 - (/#/billing/address) 请从这里开始。

期待看到一些 EmberJS 的人把事情弄清楚:)

最佳答案

我一直在做同样的事情。我认为你走在正确的轨道上,汤姆关于国家的整个观点的引述确实触及了它的核心。路由器变化很快,所以不确定这里是否存在既定模式,但我可以分享我目前学到的知识。

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

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

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

鉴于 Tom 所说的状态,我尽可能地避免这种情况。与其尝试“保护”路由,不如使用路由 + 状态的组合来确保用户无法首先到达无效状态。在您的示例中,您将更改为:

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

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

非常想知道其他人是如何解决这个问题的。希望这会有所帮助。

关于javascript - 在 Ember.js (Ember.Router) 中限制对特定路由的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11191857/

相关文章:

javascript - ExtJS:当另一个调用存在时,击键的 ajax 调用不起作用

javascript - 在三个js中如何创建半径增加但通过相同点的球体说(0,0,200)

javascript - 在选择选项中显示部分值

javascript - 我们如何使用 ember-cli 对模型混合进行单元测试

javascript - raphaeljs 对象的可点击区域更大

Android如何以编程方式获取路由器制造商名称

c++ - C++ 中的 UPnP 发现?

Fluro包中Flutter Navigator默认路由路由

javascript - 使用 React 在 iframe 上编辑 Css

javascript - 奇怪的行为 Ember 无限插件