對於日常開發中,難免會有controller之間通訊需求。對於controller之間通訊有兩種方式可以做到。
用 angular 進行開發,基本上都會遇到 controller 之間通訊的問題,本文對此進行乙個總結。
在 angular 中,controller 之間通訊的方式主要有三種:
1)作用域繼承。利用子 controller 控制父 controller 上的資料。(父 controller 中的資料要為引用型別,不能是基本型別,原因參見 angularjs中的作用域 一文)
2)注入服務。把需要共享的資料註冊為乙個service
,在需要的 controller 中注入。
3)基於事件。利用 angular 的事件機制,使用$on
、$emit
和$boardcast
其中,作用域繼承僅限於上下級之間的通訊,注入服務和基於事件的機制可以實現任意級別的 controller 通訊。
在 這裡 可以檢視下面栗子的演示。
原理在 作用域 一文中有講解,這裡直接上栗子。
頁面:
data in parent controller : }控制器:
angular.module('demo', )以上是父 controller 中的資料是引用型別的情況。如果父 controller 中的資料是基本型別,可通過.controller('parentctrl', ['$scope', function($scope)
}]).controller('childctrl', ['$scope', function($scope)])
$scope.$parent.data
訪問。
很顯然,這種方式僅適用於父子級間 controller 的通訊。
在 angular 中,服務是乙個單例,所以在服務中生成乙個物件,該物件就可以利用依賴注入的方式在所有的控制器中共享。
看個栗子,先定義乙個service
:
angular.module('demo')頁面:.factory('data', function();
})
控制器:
.controller('childctrl1', ['$scope', 'data', function($scope, data)])這種方式適用於任何需要通訊的 controller 之間。.controller('childctrl2', ['$scope', 'data', function($scope, data)])
angular 為$scope
提供了冒泡和隧道機制,$broadcast
會把事件廣播給所有子 controller,而$emit
則會將事件冒泡傳遞給父 controller,$on
則是 angular 的事件監聽函式,利用這三者,可以實現上下級和同級(需要構造乙個共同的父級 controller)之間的通訊。
這種情況下比較簡單。
如果是子 controller 往父 controller 上傳送事件(從作用域往上傳送事件),使用scope.$emit
$scope.$emit("someevent", {});如果是父 controller 往子 controller 上傳送事件(從作用域往下傳送事件),使用
scope.$broadcast
$scope.$broadcast("someevent", {});無論是
$emit
還是$broadcast
傳送的事件,都用$scope.$on
接收:
$scope.$on("someevent", function(event, data) );同級之間利用事件通訊有兩種方法。一種是利用上下級之間事件傳播的變形,另一種是借助
$rootscope
。
借助父 controller
先看第一種,在子 controller 中向父 controller 觸發乙個事件,然後在父 controller 中監聽事件,再廣播給子 controller ,這樣通過事件攜帶的引數,實現了資料經過父 controller,在同級 controller 之間傳播。
但是要注意,通過父 controller 作為中介進行傳遞的話,子 controller 觸發的事件名和父 controller 廣播用的事件名不能一樣,否則會進入死迴圈。
看**:
關鍵部分在控制器:
.controller('outerctrl', ['$scope', function($scope))借助 $rootscope}]).controller('innerctrl1', ['$scope', function($scope)
$scope.$on('changedata', function(event, data))
}]).controller('innerctrl2', ['$scope', function($scope)
// 3. 監聽到 changedata 事件後,改變子 ctrl2 中 資料
$scope.$on('changedata', function(event, data))
}])
每個 angular 應用預設有乙個根作用域$rootscope
, 根作用域位於最頂層,從它往下掛著各級作用域。
所以,如果子控制器直接使用$rootscope
廣播和接收事件,那麼就可實現同級之間的通訊。
看栗子:
控制器:
.controller('innerctrla', ['$scope', '$rootscope', function($scope, $rootscope)$rootscope.$on('namechanged', function(event, data))
}]).controller('innerctrlb', ['$scope', '$rootscope', function($scope, $rootscope)
// 監聽事件
$rootscope.$on('namechanged', function(event, data))
}])
程式之間通訊
訊息作用 在程序間共享資料 內部通過建立記憶體對映檔案 訊息介紹 需要用到的資料結構 型別 typedef struct tagcopydatastruct copydatastruct,pcopydatastruct 結構體引數說明 dwdata ulong 儲存乙個數值,可以用來作標誌等 lpd...
EXE之間通訊
而且還有好幾種方法。1 傳送訊息傳遞 2 共享記憶體傳遞 3 使用com程序外伺服器 這篇文章主要說明一下,如何利用傳送訊息使兩個exe完成通訊。其他兩個方法感興趣可以搜尋下,都可以找到相應 傳送端 public partial class mainwindow window structlayou...
元件之間通訊
一 父元件向子元件傳遞資料 在 vue 中,可以使用 props 向子元件傳遞資料。子元件部分 這是 header.vue 的 html 部分,logo 是在 data 中定義的變數。如果需要從父元件獲取 logo 的值,就需要使用props logo 在 props 中新增了元素之後,就不需要在 ...