2012-06-25 25 views
3

我目前正在測試Ember.Router,我想知道如何在匹配特定條件時限制對某些特定路線的訪問。在我的示例中,我正在使用結帳過程,在該過程中必須設置帳單地址,然後用戶才能繼續使用結算方法等(例如:結算方法視圖需要知道結算國家以提供其允許的付款方式)。我試圖驗證模型(serialize:function()或可能輸入:function()?),並且當給定的值沒有設置,路由器應該重定向到以前的狀態(有以稍微的超時執行此操作,否則哈希將無法正確更新)。限制訪問Ember.js中的特定路線(Ember.Router)

這裏是我的示例代碼

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

編輯小提琴:

發現湯姆·戴爾一些話,但沒有涉及到這個問題,但仍然是一個很好的答案:「整個國家的一點是要避免這樣的情況......目前的國家有責任處理它們。「

cf. http://github.com/emberjs/ember.js/issues/745

那麼這是有道理的。

EDIT2:

雖然這是有道理的,而定位方法設置爲 '零'。當使用'hash'或'history'來處理位置狀態並且用戶在比/ index更深的路線上重新加載頁面時 - 當前路線必須驗證這些值,並且如果某個標準不匹配,則最終重定向到先前的路線而確實驗證屬於之前的路線)。爲了簡短起見,現在的路由驗證應該取決於前一個路由,並且在滿足所有條件時應該重定向到一個狀態。

逆序:

  • 交付方法? (/#/ delivery/method)nope - >
  • 結算方式? (/#/ billing/method)nope - >
  • 送貨地址? (/#/ delivery/address)nope - >
  • 賬單地址 - (/#/ billing/address)請從這裏開始。

期待看到一些EmberJS鄉親澄清一些事情:)

回答

2

我一直在工作一樣。我認爲你在正確的軌道上,湯姆關於整個國家點的引用真的是它的核心。路由器變化很快,所以不確定這裏有確定的模式,但我可以分享我迄今爲止學到的東西。

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

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

  • 使用SproutCore的狀態圖,它允許併發狀態(SinisterMinister)
  • 暫停狀態轉變中游,等待加載數據(由lukemelia建議)在早期版本的灰燼路由器的
  • 你可以使用標記過渡作爲異步但已被刪除

鑑於湯姆說的狀態,我儘量避免這種情況。與其試圖「保護」路線,不如使用路線+狀態混合來確保用戶無法首先到達無效狀態。在你的榜樣,你會更改爲:

  • 一個單一的「路由」狀態爲「/計費」
  • 2「子狀態」命名「方法」和「地址」(這應該擴展Ember.State代替Ember.Router的和沒有設定的路線)
  • 「/記帳」路由的初始化狀態將是「地址」
  • router.send(「billingAddressUpdated」)時BillingAddressModel變化(通過用戶動作或異步數據負載)
  • billingAddressUpdated事件在「方法」和「地址」子狀態之間進行適當轉換

順便說一句你需要使用HEAD燼這種方法,因爲沒有路由的子狀態被打破,直到最近的提交。

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

相關問題