簡體   English   中英

在Ember.js(Ember.Router)中限制對特定路線的訪問

[英]Restrict access to specific routes in Ember.js (Ember.Router)

我正在測試Ember.Router ,我想知道如何在匹配某個標准時限制對某些特定路由的訪問。 在我的示例中,我正在玩結帳流程,其中必須先設置帳單郵寄地址,然后用戶才能繼續使用結算方式等等(例如:結算方式視圖需要知道結算國家/地區以提供其允許的付款方式)。

在我嘗試我試圖驗證模型(序列化:函數()或可能輸入: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人員清理事情:)

我一直在努力。 我認為你走在正確的軌道上,從湯姆那里引用了整個國家的真實情況。 路由器正在快速變化,所以不確定這里是否有既定的模式,但我可以分享到目前為止我學到的東西。

總結一般問題:Ember路由器使用url序列化/反序列化app狀態。 除了知道所要求的路線外,它是無國籍的。 最終用戶可以完全控制此狀態,並可以通過輸入URL在任何狀態下重新加載應用程序。 因此,在給定用戶權限和模型的當前狀態的情況下,所有應用程序都會遇到一個常見問題:何時/如何驗證所請求的狀態是否“有效”。

來自Rails,我的第一直覺是保護路線,就像我們在之前的過濾器一樣。 這在Ember中很棘手 - 因為數據加載是異步的,所以在初始下降到路由層次結構期間它不可用。 沒有讓這種方法自己工作,但其他人有。 典型的方法似乎是

  • 使用sproutcore statechart,它允許並發狀態(SinisterMinister)
  • 暫停狀態轉換中途,等待數據加載(由lukemelia建議)
  • 在早期版本的Ember路由器中,您可以將標記轉換用作異步但已被刪除

鑒於湯姆所說的關於各州的事情,我試圖盡可能避免這種情況。 不要試圖“保護”路線,而是使用混合的路線+狀態來確保用戶首先無法達到無效狀態。 在您的示例中,您將更改為:

  • “/ billing”中的單個“可路由”狀態
  • 2個“子狀態”命名為'method'和'address'(這些應該擴展Ember.State而不是Ember.Router並且不設置路由)
  • '/ billing'路線的initialState是'地址'
  • BillingAddressModel更改時(通過用戶操作或異步數據加載)router.send('billingAddressUpdated')
  • billingAddressUpdated事件在'method'和'address'子句之間適當地轉換

BTW你需要使用HEAD ember來實現這種方法,因為沒有路由的子狀態會被破壞,直到最近的提交。

非常好奇,了解別人如何解決這個問題。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM