【转】angularJS的兄弟controller之间怎样准确的通讯

原文链接:http://www.cnblogs.com/webbes…

AngularJS中的controller是个函数,用来向视图的作用域($scope)增加分外的功用,我们用它来给作用域对象设置初始状况,并增加自定义行动。

当我们在建立新的控制器时,angularJS会帮我们天生并通报一个新的$scope对象给这个controller,在angularJS运用的中的任何一个部份,都有父级作用域的存在,顶级就是ng-app地点的层级,它的父级作用域就是$rootScope。

每一个$scope的$root指向$rootScope, $cope.$parent指向父级作用域。

cotroller之间的通讯本质上是当前的controller地点的$scope怎样跟其他controller上的$scope举行通讯。

平常有3中处置惩罚体式格局:

应用作用域继续的道理,子控制器接见父级控制器中的内容。
运用angularJS中的事宜,也就是运用$on,$emit,$broadcast举行音讯通报
运用angularJS中的效劳

第一种体式格局

即作用域嵌套作用域,有肯定的运用限定,须要作用域嵌套起来,在现实开辟中这类场景相对比较少,但也不是没有,这类体式格局更简朴直接。

angularJS中默许情况下,当前作用域中没法找到某个属性时,就会在父级作用域中举行查找,若找不到直至查找到$rootScope。 假如在$rootScope中也没法找到顺序照旧运转,但视图不会更新。

示例

JavaScript

//Javascript

    app.controller('ParentController', function($scope) { 

        $scope.person = {greeted: false};

    });

    app.controller('ChildController', function($scope) {

        $scope.sayHello = function() {

             $scope.person.name = 'Ari Lerner';

        };

    });

    //HTML

     <div ng-controller="ParentController">

       <div ng-controller="ChildController">

         <a ng-click="sayHello()">Say hello</a>

       </div>

       {{ person }}

     </div>

    //result

    {"greeted":true, "name": "Ari Lerner"}
    

第二种体式格局

由于作用域是有条理的,所以可以应用作用域链通报事宜。

通报事宜有2种体式格局: $broadcast: 触发的事宜要关照全部事宜体系(许可恣意作用域处置惩罚这个事宜)就要向下流传。 $emit: 假如要提示一个全局模块,须要关照更高条理的作用域时(比方$rootscope)须要把事宜向上通报。

作用域上运用$on举行事宜监听。

示例

JavaScript

app.controller('ParentController', function($scope) { 
        $scope.$on('$fromSubControllerClick', function(e,data){
            console.log(data); // hello
        });
    });

    app.controller('ChildController', function($scope) {
        $scope.sayHello = function() {
            $scope.$emit('$fromSubControllerClick','hello');
        };
    });

    //HTML
     <div ng-controller="ParentController">
       <div ng-controller="ChildController">
         <a ng-click="sayHello()">Say hello</a>
       </div>
     </div>
     

在这里想要说的别的一个题目就是事宜流传的机能题目,$broadcast+$on的体式格局回关照一切的子作用域,这里就会有机能题目,所以引荐运用$emit+$on的体式格局,为了进一步提拔机能,定义的事宜处置惩罚函数要在作用域烧毁时一同释放掉。

运用$emit+$on的体式格局须要我们将事宜监听绑定在$rootScope上,比方:

JavaScript

angular
    .module('MyApp')
    .controller('MyController', ['$scope', '$rootScope', function MyController($scope, $rootScope) {
            var unbind = $rootScope.$on('someComponent.someCrazyEvent', function(){
                console.log('foo');
            });
            $scope.$on('$destroy', unbind);
        }
    ]);

然则这类体式格局有点烦琐,定义多个事宜处置惩罚函数时全部人都不好了,所以我们来革新一下

应用装潢器来定义一个新的事宜绑定函数:

JavaScript

angular
    .module('MyApp')
    .config(['$provide', function($provide){
        $provide.decorator('$rootScope', ['$delegate', function($delegate){
            Object.defineProperty($delegate.constructor.prototype, '$onRootScope', {
                value: function(name, listener){
                    var unsubscribe = $delegate.$on(name, listener);
                    this.$on('$destroy', unsubscribe);
                    return unsubscribe;
                },
                enumerable: false
            });
            return $delegate;
        }]);
    }]);

那末我们在控制器中定义事宜处置惩罚函数时:

JavaScript

angular
    .module('MyApp')
    .controller('MyController', ['$scope', function MyController($scope) {
            $scope.$onRootScope('someComponent.someCrazyEvent', function(){
                console.log('foo');
            });
        }
    ]);
    

第三种体式格局

应用angularJS中service单例形式的特征,效劳(service)供应了一种能在运用的全部生命周期内坚持数据的体式格局,可以在控制器之间举行通讯,且能保证数据的一致性。

平常我们都邑封装server来为运用供应接见数据的接口,或许跟长途举行数据交互。

示例

JavaScript

var myApp = angular.module("myApp", []);
myApp.factory('Data', function() {
  return {
    name: "Ting"
  }
});

myApp.controller('FirstCtrl', function($scope, Data) {
  $scope.data = Data;
  $scope.setName = function() {
    Data.name = "Jack";
  }
});

myApp.controller('SecondCtrl', function($scope, Data) {
  $scope.data = Data;
  $scope.setName = function() {
    Data.name = "Moby";
  }
});

关于同级controller之间通讯我的一个发问:https://segmentfault.com/q/10…

    原文作者:嘉恩Gavin
    原文地址: https://segmentfault.com/a/1190000010419681
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞