angular controller 之间的通信方式

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

当我们在创建新的控制器时,angularJS会帮我们生成并传递一个新的$scope对象给这个controller,在angularJS应用的中的任何一个部分,都有父级作用域的存在,顶级就是ng-app所在的层级,它的父级作用域就是$rootScope。

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

cotroller之间的通信本质上是当前的controller所在的$scope如何跟其他controller上的$scope进行通信。

方法共有三种:

利用作用域继承的原理,子控制器访问父级控制器中的内容。
使用angularJS中的事件,也就是使用$on,$emit,$broadcast进行消息传递
使用angularJS中的服务

一:利用作用域继承的原理,子控制器访问父级控制器中的内容。

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

        $scope.person = {greeted: false};

    });

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

        $scope.sayHello = function() {

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

        };

    });

二:

$emit只能向parent controller传递event与data
$broadcast只能向child controller传递event与data
$on用于接收event与data

"ParentCtrl">
"SelfCtrl"> "click()">click me
"ChildCtrl">
"BroCtrl">
app.controller('SelfCtrl', function($scope) { $scope.click = function () { $scope.$broadcast('to-child', 'child');//向下传递 $scope.$emit('to-parent', 'parent');//向上传递 } }); app.controller('ParentCtrl', function($scope) { $scope.$on('to-parent', function(event,data) { console.log('ParentCtrl', data); //父级能得到值 }); $scope.$on('to-child', function(event,data) { console.log('ParentCtrl', data); //子级得不到值 }); });

 

三:利用angularJS中service单例模式的特性,服务(service)提供了一种能在应用的整个生命周期内保持数据的方式,能够在控制器之间进行通信,且能保证数据的一致性。

一般我们都会封装server来为应用提供访问数据的接口,或者跟远程进行数据交互。

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";
  }
});

转载于:https://www.cnblogs.com/bruce-gou/p/6382450.html

你可能感兴趣的:(angular controller 之间的通信方式)