Angularjs實(shí)現(xiàn)控制器之間通信方式實(shí)例總結(jié)
本文實(shí)例講述了Angularjs實(shí)現(xiàn)控制器之間通信方式。分享給大家供大家參考,具體如下:
利用angularjs開發(fā)項(xiàng)目中,控制器之間的通信,比如參數(shù)的傳遞,數(shù)據(jù)的傳遞,都是比較常見的??刂破髦g的通信,顯得尤為重要。常見的方式有如下兩種:一、angular服務(wù)的方式;二、基于事件廣播的方式;另外,還有基于作用域繼承的方式。下面先說一下前兩種方式:
一、基于angular服務(wù)的方式:
在angular中服務(wù)是一個(gè)單例,所以在服務(wù)中生成一個(gè)對(duì)象,該對(duì)象就可以利用依賴注入的方式在所有的控制器中共享。參照以下例子,在一個(gè)控制器修改了服務(wù)對(duì)象的值,在另一個(gè)控制器中獲取到修改后的值:
var app = angular.module('myApp', []); app.factory('Myservice', function(){ return {}; }); //定義服務(wù) app.controller('Ctrltest1', function($scope, 'Myservice') { $scope.change = function() { Myservice.name = $scope.test; //在第一個(gè)控制器中為服務(wù)對(duì)象賦值 }; }); app.controller('Ctrltst2', function($scope, 'Myservice') { $scope.add = function() { $scope.name = Myservice.name; //將第一個(gè)控制器中為服務(wù)對(duì)象賦的值傳給第二個(gè)控制器 }; });
<div ng-controller='Ctrltest1'> <input type="text" ng-model="test" /> <div ng-click="change()">click me</div> </div> <div ng-controller='Ctrltest2'> <div ng-click="add()">my name {{name}}</div> </div>
二、基于事件廣播的方式
基于事件廣播,需要用到$emit()
、$broadcaset()
和$emit()
這三個(gè)方法。
1. 向父作用域?qū)哟谓Y(jié)構(gòu)發(fā)出自定義事件:使用$emit()
方法,scope.$emit(name,[args,...])
注:name是事件名,args 是0個(gè)或多個(gè)參數(shù)。
應(yīng)用場(chǎng)景:用于子頁面控制器向父頁面的控制器傳遞參數(shù)。
2. 向子作用域?qū)哟谓Y(jié)構(gòu)廣播自定義事件:
應(yīng)用場(chǎng)景:用于父頁面控制器向子頁面的控制器傳遞參數(shù)或者同級(jí)控制器之間傳遞參數(shù)。
使用$broadcaset()
方法,$scope.$broadcaset(name,[args,...])
注:name是事件名,args 是0個(gè)或多個(gè)參數(shù).
3. 使用偵聽器處理自定義事件
為了處理發(fā)出或廣播的事件,可以使用$on()
方法。$on()
方法將使用下面的語法:
$scope.$on(name,listener)
注:name 是將要偵聽的事件的名字,listener參數(shù)是一個(gè)函數(shù),它將接受事件作為第一個(gè)參數(shù),接受$emit()
或者$broadcaset()
方法傳遞的其他所有參數(shù)作為隨后的參數(shù)。$on()
方法主要用于監(jiān)聽$emit()
和$broadcaset()
方法中事件的變化,例如這兩個(gè)方法中如果有變量發(fā)生改變,$on()方法將會(huì)獲取到該變量的改變。
參照以下例子,在一個(gè)控制器修改了變量的值,在另一個(gè)控制器中會(huì)偵聽到修改后的值,并根據(jù)修改后的值,做出響應(yīng)。
app.controller('versiontaskCtrl', function WriteTestcaseCtrl($scope, $cookies, $rootScope, $modal, $stateParams, ui, searchVariable, currentuserversions,) { $scope.taskId = $cookies['edit_taskId']; $scope.versionid = parseInt($cookies['edit_versionId']); $scope.versionName = $cookies['edit_versionName']; $scope.version = $scope.versionid; getuserversions = function () { currentuserversions.get(function (res) { $scope.versions = res; }); }; reload = function () { getuserversions(); }; $scope.changeVersionid = function (v) { console.log(v); $scope.$broadcast('versionidChange', $scope.versionid); //向其他控制器廣播$scope.versionid值的變化。 }; reload(); });
第二個(gè)控制器中監(jiān)聽第一個(gè)控制器中的廣播事件:
app.controller('SchemeTaskEditableRowCtrl', function ($scope, $rootScope, $cookies, $filter, $http, $window, $stateParams, basetasksService, schemetasksService, UserService) { $scope.taskId = $cookies['edit_taskId']; $scope.versionid = $cookies['edit_versionId']; $scope.version = $scope.versionid; var userid = $rootScope.user.userid; $scope.schemetask = []; $scope.basetask = []; $scope.result = []; $scope.$on('versionidChange', function (event, versionid) { $scope.versionid = versionid; //監(jiān)聽到$scope.versionid值的變化。然后調(diào)用 $scope.schemeTask()和$scope.getUsers()這兩個(gè)方法 $scope.schemeTask(); $scope.getUsers(); }); $scope.schemeTask = function () { $scope.tasks = []; $scope.schemetask = []; schemetasksService.get({version: $scope.versionid}, function (res) { $scope.schemetask_collection = res.results; //console.log($scope.schemetask_collection); $scope.schemetask_displayed = [].concat($scope.schemetask_collection); var i = 1; angular.forEach($scope.schemetask_collection, function (item) { item['director'] = "app.writetestitem" + "({taskid:" + item.id + "})"; item['number'] = i; i++; $scope.schemetask.push(item); }); $scope.tasks = $scope.schemetask; }); }; $scope.getUsers = function () { UserService.get(function (res) { $scope.users = res.results; $scope.usersDisplayed = [].concat($scope.users); $scope.itemArray = []; $scope.userArray = []; $scope.names = []; angular.forEach($scope.users, function (item) { $scope.itemArray.push(item); $scope.userArray.push(item.name + item.number); var itemname = {'name': item.name, 'number': item.number}; $scope.names.push(itemname); }); $scope.selected = $scope.users; }); }; });
關(guān)于Angularjs控制器之間通信方式,暫且總結(jié)到此,歡迎大家批評(píng)指正交流!
更多關(guān)于AngularJS相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《AngularJS指令操作技巧總結(jié)》、《AngularJS入門與進(jìn)階教程》及《AngularJS MVC架構(gòu)總結(jié)》
希望本文所述對(duì)大家AngularJS程序設(shè)計(jì)有所幫助。
相關(guān)文章
Angular實(shí)現(xiàn)搜索框及價(jià)格上下限功能
這篇文章主要為大家詳細(xì)介紹了Angular實(shí)現(xiàn)搜索框及價(jià)格上下限功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Angular2 Service實(shí)現(xiàn)簡(jiǎn)單音樂播放器服務(wù)
本篇文章主要介紹了Angular2 Service實(shí)現(xiàn)簡(jiǎn)單音樂播放器服務(wù) ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02Angular項(xiàng)目如何使用攔截器?httpClient?請(qǐng)求響應(yīng)處理
這篇文章主要介紹了Angular項(xiàng)目簡(jiǎn)單使用攔截器httpClient請(qǐng)求響應(yīng)處理,目前我的Angular版本是Angular?17.3,版本中實(shí)現(xiàn)請(qǐng)求和響應(yīng)的攔截處理了,這種機(jī)制非常適合添加如身份驗(yàn)證頭、錯(cuò)誤統(tǒng)一處理、日志記錄等功能,需要的朋友可以參考下2024-06-06Angular 4.x中表單Reactive Forms詳解
這篇文章主要介紹了Angular 4.x中表單Reactive Forms的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-04-04詳解Angular中通過$location獲取地址欄的參數(shù)
這篇文章主要介紹了詳解 Angular中通過$location獲取地址欄的參數(shù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08AngularJS實(shí)現(xiàn)表格的增刪改查(僅限前端)
這篇文章主要介紹了AngularJS實(shí)現(xiàn)表格的增刪改查,僅限前端,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07