angular中控制器之間的傳值該怎麼實現?

答主老司機們的回答都是經典, 有一個回答有提到了angualr的編寫規範.

我們的項目在按照規範寫了之後真的在各方面都變得嗨了很多.

這是規範的鏈接. 拿出來大家去看看

angular-styleguide/zh-CN.md at master · johnpapa/angular-styleguide · GitHub

-------------更新線,下為原文----------------------

有找到這麼一個解決方案.

Angularjs Controller 間通信機制

這種方案如果父controller之間甚至父的父controller之間仍是兄弟關係如同這個案例這樣..還有什麼方案推薦么...

其實還有一個想問的 就是有關於$scope.$id

還有 現在也獲取到了每個controller 的 $scope.$id($scope1的$id 為15,$scope2 的$id為22), 能有什麼辦法 在controller2中通過15 這個$scope1的$id從而獲取到$scope1 這個對象呢?

畫圖不易 T.T

老司機們快來答題 -3-


每個controller都會有自己的scope,所有的scope都是屬於 $rootScope的子或者子的子...

那麼問題就好解決了,通過 $rootScope.$broadcast 廣播的事件每個controller都能收到事件


上面的說的基本上很全了,我再總結補充一下吧。

通過Angular的話可以通過下面四種方法

1、event

這裡可以有兩種方式,一種是$scope.$emit,然後通過監聽$rootScope的事件獲取參數;另一種是$rootScope.$broadcast,通過監聽$scope的事件獲取參數。

這兩種方法在最新版本的Angular中已經沒有性能區別了,主要就是事件發送的方向不同,可以按實際情況選擇。

2、service

可以創建一個專用的事件Service,也可以按照業務邏輯切分,將數據存儲在相應的Service中,因為已經有人提過了就不贅述了。

3、$rootScope

這個方法可能會比較dirty一點,勝在方便,也就是把數據存在$rootScope中,這樣各個子$scope都可以調用,不過需要注意一下生命周期

4、直接使用$scope.$$nextSibling及類似的屬性

類似的還有$scope.$parent。這個方法的缺點就更多了,官方不推薦使用任何$$開頭的屬性,既增加了耦合,又需要處理非同步的問題,而且scope的順序也不是固定的。不推薦

另外就是通過本地存儲、全局變數或者現代瀏覽器的postMessage來傳遞參數了,除非特殊情況,請避免這類方式。

最後

johnpapa/angular-styleguide · GitHub

這個代碼風格可以參考一下,對代碼的整體組織可以有些幫助

以上

參考

scope - What"s the correct way to communicate between controllers in AngularJS?

AngularJS Services cross controller communication, data persistence

javascript - How can I pass variables between controllers?


看我這個栗子的最後兩個選項卡

angularjs scope

然後,原理在這裡:AngularJS實例教程(二)——作用域與事件 · Issue #18 · xufei/blog · GitHub


如其他答案,可以用event。

另外,我的經驗是,盡量不要用event傳數據。應該建立一個service來保存數據,並且設置相應getter/setter,具體如下:

每個controller依賴service, call service.setter(...)

統一的service.setter(...)在改完數據後可以$emit("data-updated")

每個controller里$on("data-updated", function(){ $scope.data = service.getData() })


現在這麼看來,其實就是React里的store的概念。。。

---原答案---

直接建一個service,不要用什麼事件,項目一大N多個controller或者N久再去維護會玩死你,service里提供存和取的方法,簡單明了,API容易查找和修改,調試也方便無混亂的依賴關係


如果不在一個module里怎麼辦


mark


推薦閱讀:

angularjs中不同頁面controller中數據傳遞的問題?
AngularJS的數據雙向綁定是怎麼實現的?
AngularJS 1.x 的缺點如何解決?

TAG:JavaScript | Nodejs | 前端開發框架和庫 | AngularJS |