本文实例讲述了Angularjs实现控制器之间通信方式。分享给大家供大家参考,具体如下:
利用angularjs开发项目中,控制器之间的通信,比如参数的传递,数据的传递,都是比较常见的。控制器之间的通信,显得尤为重要。常见的方式有如下两种:一、angular服务的方式;二、基于事件广播的方式;另外,还有基于作用域继承的方式。下面先说一下前两种方式:
一、基于angular服务的方式:
在angular中服务是一个单例,所以在服务中生成一个对象,该对象就可以利用依赖注入的方式在所有的控制器中共享。参照以下例子,在一个控制器修改了服务对象的值,在另一个控制器中获取到修改后的值:
var app = angular.module('myApp', []);
app.factory('Myservice', function(){
return {};
});
//定义服务
app.controller('Ctrltest1', function($scope, 'Myservice') {
$scope.change = function() {
Myservice.name = $scope.test; //在第一个控制器中为服务对象赋值
};
});
app.controller('Ctrltst2', function($scope, 'Myservice') {
$scope.add = function() {
$scope.name = Myservice.name; //将第一个控制器中为服务对象赋的值传给第二个控制器
};
});
<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()这三个方法。
1. 向父作用域层次结构发出自定义事件:使用$emit()方法,scope.$emit(name,[args,...])
注:name是事件名,args 是0个或多个参数。
应用场景:用于子页面控制器向父页面的控制器传递参数。
2. 向子作用域层次结构广播自定义事件:
应用场景:用于父页面控制器向子页面的控制器传递参数或者同级控制器之间传递参数。
使用$broadcaset()方法,$scope.$broadcaset(name,[args,...])
注:name是事件名,args 是0个或多个参数.
3. 使用侦听器处理自定义事件
为了处理发出或广播的事件,可以使用$on()方法。$on()方法将使用下面的语法:
$scope.$on(name,listener)
注:name 是将要侦听的事件的名字,listener参数是一个函数,它将接受事件作为第一个参数,接受$emit()或者$broadcaset()方法传递的其他所有参数作为随后的参数。$on()方法主要用于监听$emit()和$broadcaset()方法中事件的变化,例如这两个方法中如果有变量发生改变,$on()方法将会获取到该变量的改变。
参照以下例子,在一个控制器修改了变量的值,在另一个控制器中会侦听到修改后的值,并根据修改后的值,做出响应。
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();
});
第二个控制器中监听第一个控制器中的广播事件:
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; //监听到$scope.versionid值的变化。然后调用 $scope.schemeTask()和$scope.getUsers()这两个方法
$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;
});
};
});
关于Angularjs控制器之间通信方式,暂且总结到此,欢迎大家批评指正交流!
更多关于AngularJS相关内容感兴趣的读者可查看本站专题:《AngularJS指令操作技巧总结》、《AngularJS入门与进阶教程》及《AngularJS MVC架构总结》
希望本文所述对大家AngularJS程序设计有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]