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

时间:2012-06-25 15:02:09

标签: javascript ember.js router

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

在我的尝试中,我正在尝试验证模型(serialize:function()或者输入:function()?),当没有设置给定值时,路由器应该重定向到以前的状态(必须使用一点超时执行此操作,否则哈希将无法正确更新。

这是我的示例代码

的小提琴

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

修改

找到汤姆戴尔的一些话,虽然与这个问题没有关系,但仍然是一个很好的答案:“国家的整个观点是避免这样的情况......当前国家有责任处理它们。”

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

这很有道理。

EDIT2:

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

简而言之,当前的路线验证应该取决于前一个路线,并且应该在满足所有条件时重定向到一个状态。

逆序:

  • 送货方式? (/#/ delivery / method)nope - >
  • 结算方式? (/#/ billing / method)nope - >
  • 送货地址? (/#/ delivery / address)nope - >
  • 帐单邮寄地址 - (/#/结算/地址)请从此处开始。

期待看到一些EmberJS人员清理事情:)

1 个答案:

答案 0 :(得分:2)

我一直在努力。我认为你走在正确的轨道上,从汤姆那里引用了整个国家的真实情况。路由器正在快速变化,所以不确定这里是否有既定的模式,但我可以分享到目前为止我学到的东西。

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

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

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

鉴于汤姆所说的关于各州的事情,我试图尽可能避免这种情况。不要试图“保护”路线,而是使用混合的路线+状态来确保用户首先无法达到无效状态。在您的示例中,您将更改为:

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

BTW你需要使用HEAD ember来实现这种方法,因为没有路由的子状态会被破坏,直到最近提交。

非常好奇了解别人如何解决这个问题。希望这会有所帮助。