2013-05-08 34 views
0

我的應用程序的某些部分需要用戶驗證,可以自動(使用存儲爲cookie的現有刷新令牌)或手動使用登錄表單完成。需要按控制器/視圖登錄(Angular JS)

雖然我可以使用一個服務來實現它,但它感覺相當ha((各種服務都是爲了返回數據而設計的)。但我想不出有更好的方式來分享不同控制器之間的功能。

P.S 我確實檢出了https://github.com/witoldsz/angular-http-auth,但是捕獲401錯誤並啓動登錄意味着即使我可以告訴它將會失敗,我也會撥打額外的電話。

回答

3

我認爲你完全可以將登錄過程分解成一個服務,因爲將信息存儲並傳遞給應用程序中的各種控制器是非常重要的,這正是服務的目的。

我創建了一個使用類似於您指出的鏈接的錯誤報告應用程序,但我使用服務和控制器也對其進行了自定義。這是我跟我設置它的步驟:

  • 首先,我設置了攔截趕上401錯誤, 廣播是需要登錄的消息。

  • 然後我建立一個authService來記錄所有那些不好的401調用。如果 有一個不好的調用,它會被存儲。

  • 我也有同樣使用該authService比 處理表單,註冊,登錄,註銷,等等等等。 控制器在每個頁面上的菜單使用的登錄控制,所以沒有機會 那一個廣播事件可能會被錯過。我的控制器收聽廣播事件 ,收到時顯示登錄表單。

  • 成功登錄後,我告訴我的authService重複所有這些 存儲的呼叫並刪除它們。

現在這個偉大的工程,但如果有人刷新頁面,則authService被刪除,攔截器將不得不再次完成所有的工作,活動將需要播出,最終卻是一個痛苦。爲了解決這個問題,我在我的登錄控制器中進行了簡單的檢查

  • 首先檢查authService是否存儲了用戶對象。

  • 如果不是,請檢查服務器,如果結果是用戶已登錄,則再次填充authService。

  • 如果用戶沒有登錄,什麼也不做,而是讓authService知道你已經對服務器檢查,看到該用戶沒有登錄。

再次,在我我不想強制用戶登錄,除非他們試圖執行需要登錄的特定操作。作爲一個bug報告應用程序,我想讓匿名用戶閱讀內容,但一旦他們要發佈,他們必須註冊或登錄。

如果您的案例涉及100%的時間登錄,您可以完全忽略攔截器。只需建立一個服務和一個控制器。如果登錄控制器發現authService未被填充,則重定向到登錄屏幕。刷新後,對服務器執行一次簡單檢查,以確保它們仍然登錄,否則重定向到登錄屏幕。

+0

謝謝,我正在慢慢地朝着類似的解決方案努力,但這會爲我節省相當多的時間。 – 2013-05-08 20:31:45

3

服務在這種情況下非常合適。如最佳實踐的this video中所述,服務與「獲取數據」不太相關,因爲它將邏輯從控制器中分離出來。一個控制器說要做什麼,一個服務說如何去做。

所以,你的情況,一個控制器說:「我需要檢查,如果用戶進行身份驗證」,但知道該怎麼做,這取決於服務。

這完全符合數據收集的概念。一名管理員說:「我需要獲得所有的員工信息。」該服務定義瞭如何。

他特別在本次會議上說,每當有一個需要控制器之間的信息共享,服務是幾乎總是做到這一點的最好辦法。

相關問題