开发者社区> 问答> 正文

Angularjs实现控制器之间通信方式示例

Angularjs实现控制器之间通信方式示例

展开
收起
社区秘书 2019-12-16 13:35:16 831 0
1 条回答
写回答
取消 提交回答
  • 
    
    
    一、基于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;
      });//欢迎加入前端全栈开发交流圈一起学习交流:864305860
     };
     reload = function () {
      getuserversions();
     };
     $scope.changeVersionid = function (v) {
      console.log(v);
      $scope.$broadcast('versionidChange', $scope.versionid); //向其他控制器广播$scope.versionid值的变化。
     };
     reload();
    });//欢迎加入前端全栈开发交流圈一起学习交流:864305860
    第二个控制器中监听第一个控制器中的广播事件:
    
    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();
     });//欢迎加入前端全栈开发交流圈一起学习交流:864305860
     $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++;//欢迎加入前端全栈开发交流圈一起学习交流:864305860
        $scope.schemetask.push(item);
       });
       $scope.tasks = $scope.schemetask;
      });//欢迎加入前端全栈开发交流圈一起学习交流:864305860
     };
     $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;
      });//欢迎加入前端全栈开发交流圈一起学习交流:864305860
     };//面向1-3年前端人员
    });//帮助突破技术瓶颈,提升思维能力
    结语
    
    感谢您的观看,如有不足之处,欢迎批评指正。
    
    2019-12-16 13:35:55
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
ui-model,跨框架复用 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载