angularjs中不同頁面controller中數據傳遞的問題?

公司做一個項目,用的angular開發前端,本人菜鳥一個,才入行不久,硬著頭皮做了,遇到很多問題,花了很多時間,做了幾個模塊,但最大的問題是數據在不同頁面之間傳遞的問題,現例舉如下,請大神指導:

1.用戶登錄時候,通過後台restful介面,獲取成功登錄用戶的信息result,頁面跳轉到主頁;

2.關鍵是這個result怎麼帶到主頁中去,項目前端框架用的requirejs相互依賴各個模塊,基本上所有頁面的module都是一個,只是各個controller在不同的文件夾下面定義的,比如loginController.js,只處理登錄;

3.用了很多方法,數據都過不到第二個頁面,用$rootscope,沒搞定,有一個userManager的factory專門管理登錄的相關請求函數,其中包含一個login,可是登錄頁面的result不能反向保存到factory中,所以利用factory保存登錄數據失敗了。

4.後來想到了cookie,angularjs提供了$cookieStore服務,感覺用起來很方便,提供了一個put,get,和remove方法,但是奇葩的問題來了,我自己搞了個小demo,沒有用到別的插件什麼的,數據可以帶到第二個頁面。但是在我的項目裡面,登陸後,數據死活是undefined,整整花了一天時間找問題,結果沒找到。

5.最後沒辦法,只能讓後台做session,實際上可以解決這個問題,只要session在,我隨時都可以獲取到數據,但是每次獲取用戶信息都要發個請求與後台交互。

6.我想在登陸的時候就將用戶信息保存到緩存,在任何一個頁面都可以直接使用,不知道有沒有比較好的方法??????

框架用的requirejs,angularjs,grunt。所有的模塊都是封裝可復用的,由n多指令構建,比如表格,輸入框,按鈕等。

本人菜鳥一個,寫的有點亂。請指教。。。。。。


感謝邀請。

首先,Angular這類東西,更多屬於一種單頁面Web應用解決方案,注意,這裡的重點是單頁面,也就是說它能發揮價值的場景是在某一個頁面里,而跨頁面通信不是它所側重考慮的。

根據你的描述,我猜測,你有多個頁面,在初始的時候沒有做路由規劃,也沒有使用Angular的路由來設計頁面間的跳轉,而是有若干平行的普通頁面,每個頁面的內部使用Angular,然後頁面間用傳統方式進行跳轉。

這樣做,就等於是把Angular從框架降級成了庫,整個系統分散成了多個隔離的Angular應用,每個存在於一個頁面里,這樣想通信當然是很困難的,要麼使用url傳遞,要麼使用session,然後存到全局的js對象里,從Angular里取。

建議了解一下Angular內置的路由機制,還有ui-route這樣的第三方Angular路由庫,然後考慮一下現有的項目是否適合搞成這樣的路由,如果不行的話,只能用傳統方式搞了。


---

update: 大家看 @徐飛 的回答吧, 我好像理解錯題意了。

謝邀。

Controller之間的數據傳遞,一般就幾種:

  • Service: 即兩個Ctrl共用一個Service,一般用這個。
  • Event: 通過$scope的事件廣播,適用於耦合性很低時,性能會比上面的差一些。
  • $rootScope: 相當於全局變數,一般不推薦。

再回來看看你的問題:

1.「登錄頁面的result不能反向保存到factory中」 -- 應該是你沒寫對。

2. 登陸校驗一般可以放到$http的攔截器中使用.


javascript - Angular: Share data between controllers

@天豬(劉勇) 說的是對的。

我再補充一個,session不需要後台傳,restful獲取到json數據之後直接存到session就可以,可以用這個庫。

grevory/angular-local-storage · GitHub

我現在做的項目也是用angular的,我的方法是用$rootScope存user對象,同時綁定到Localstorage,並設置一個過期時間。這種方法是比較方便的,另外也可以存到一個service裡面。

當然如果你的項目是有刷新的那種,建議還是存到session或者localstorage裡面


分清刷新和載入,你要明白為什麼你需要刷新.


使用angularlocalstorage,controller里監聽$scope.$on 一個事件,然後通過廣播的形式來通知這個事件,這個事件根據接收的到數據進行數據的處理


localstorage


可以將用戶的信息result放在cookies,頁面需要用的時候就從cookies那裡取數據就行了。

AngularJS 提供了很好的 $cookie 和 $cookieStore API 用來處理 cookies 。

這裡是一個簡單的demo


我們現在H5 APP手機端的實現方式是實現一個tunnelService,維護一個全局的PARAMS. 實現PUT, GET, REMOVE函數操作數據,通過模塊名 + 自定義名來匹配數據。不建議放在rootScope。


AngularJS: Sharing Variables Between Controllers


推薦閱讀:

AngularJS的數據雙向綁定是怎麼實現的?
AngularJS 1.x 的缺點如何解決?
angular 自定義指令如何操作DOM的問題?
新手,覺得Angularjs好難,該如何學習Angularjs?
Handlebars 和angularjs有什麼區別?分別在什麼情況下使用?

TAG:前端開發 | AngularJS |