Angular中$broadcast和$emit的使用方法詳解
要在控制器之間傳遞變量變化需要使用angular中的$broadcast和$emit方法來傳遞,同時使用$on來接收事件并作出響應(yīng)。
broadcast譯為廣播,即上級傳遞下級。
示例代碼:
<script src="../angular.js"></script>
<script>
angular.module("app", [])
.controller("child", function($scope) {
$scope.$on("parentChange", function(e, m) {
$scope.change = "changed";
$scope.child = m;
})
})
.controller("parent", function($scope) {
$scope.$watch("parent", function(n, o) {
if (n == o) {
return;
}
$scope.$broadcast("parentChange", n)
})
})
</script>
<body>
<div ng-controller="parent">
Parent: {{parent}}
<input type="text" ng-model="parent">
<div ng-controller="child">
{{change}} Child: {{child}}
</div>
</div>
</body>
上述代碼使用$watch監(jiān)聽parent的值的變化,當發(fā)生變化時就會“廣播”出parentChange事件并傳遞了參數(shù)(輸入框的值),此時子元素作用域中使用了$scope.$on("parentChange, handler)" 來接收parentChange事件,然后接受輸入框的值并賦值給子作用域中的child變量。 這樣就完成了值的傳遞。
效果:

emit譯為發(fā)射,即下級傳遞上級。
示例代碼:
<script src="../angular.js"></script>
<script>
angular.module("app", [])
.controller("parent", function($scope) {
$scope.$on("childChange", function(e, m) {
$scope.change = "changed";
$scope.parent = m
})
})
.controller("child", function($scope) {
$scope.$watch("child", function(n, o) {
if (n == o) {
return;
}
$scope.$emit("childChange", n)
})
})
</script>
<body ng-controller="parent">
{{change}} Parent: {{parent}}
<div ng-controller="child">
Child: {{child}}
<input type="text" ng-model="child">
</div>
</body>
當子元素的child值發(fā)生變化時,會向上級發(fā)出childChange事件,此時父元素正在監(jiān)聽的$on(“childChange”)會做出響應(yīng),將傳遞的參數(shù)賦值給parent,整個流程與 broadcast類似。
效果:

上述作用域均存在層級關(guān)系,如果對于同級的作用域該如何做呢?
我們可以使用服務(wù)來廣播事件:
<script src="../angular.js"></script>
<script>
angular.module("app", [])
.service("myServive", function($rootScope) {
return {
change: function(n) {
$rootScope.$broadcast("valueChange", n);
}
}
})
.controller("bro1", function($scope, myServive) {
$scope.$watch("value1", function(n) {
myServive.change(n);
})
$scope.$on("valueChange", function(e, m) {
console.log("value1");
$scope.value1 = m;
})
})
.controller("bro2", function($scope, myServive) {
$scope.$watch("value2", function(n) {
myServive.change(n);
})
$scope.$on("valueChange", function(e, m) {
console.log("value2");
$scope.value2 = m;
})
})
</script>
<body>
<div ng-controller="bro1">
<h3> value1:</h3>
<input type="text" ng-model="value1">
</div>
<div ng-controller="bro2">
<h3>value2:</h3>
<input type="text" ng-model="value2">
</div>
</body>
我們在服務(wù)中運用了$rootScope,所有的作用域都從屬于它,基于這點,我們可以在根作用域中廣播事件,$rootScope.$broadcast("valueChange", n);,當每個子作用域中的值發(fā)生變化時我們都會調(diào)用服務(wù)中的change 方法來廣播這個事件,同時每個作用域又都在監(jiān)聽$on("valueChange") 事件并作出相應(yīng)處理,這樣就實現(xiàn)了子作用域中的值會傳遞給兄弟作用域了。
效果為:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
angular源碼學(xué)習(xí)第一篇 setupModuleLoader方法
這篇文章主要介紹了angular源碼學(xué)習(xí)第一篇,setupModuleLoader方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
Angular.js實現(xiàn)動態(tài)加載組件詳解
這篇文章主要給大家介紹了關(guān)于Angular.js實現(xiàn)動態(tài)加載組件的相關(guān)資料,文中介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-05-05
淺談Angularjs中不同類型的雙向數(shù)據(jù)綁定
這篇文章主要介紹了淺談Angularjs中不同類型的雙向數(shù)據(jù)綁定,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
AngularJS 實現(xiàn)點擊按鈕獲取驗證碼功能實例代碼
本文通過實例代碼給大家介紹了AngularJS 實現(xiàn)點擊按鈕獲取驗證碼功能,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-07-07

