angular 控制器之前的通信和数据传输

前端时间开发一个应用时,路由切换模块的时候需要传输数据。在网上查阅了写资料,细化了一些说明。一般有三种方式进行controller之间信息传递。

一,利用js的继承关系去传递controller之间的data,

  我最早写在我自己的应用中的就是用的这种方法,我把第一视图的控制中获取到的data数据绑定到$rootScope上面

       当路由发生改变跳转到第二视图的时候,直接在用$rootScope.answer_sheet这个数据。其实严格意义上来说这并不是数据传输,只是利于js的继承关系,两个不同的子级共用父级的一个数据而已,而且两个子集都去改变父级的数据。这样操作并不好,会造成全局污染。

二,利用angular的事件去传递信息$on,$emit,$boardcast这几个方式来实现。$emit表示向上传递(父级),$boardcast表示向下传递(子级),$on监听angular的事件,接受传递的数据。

先讲讲这个三个方法的使用

$emit()方法带有两个参数。
1. name(字符串)
要发出的事件名称。
2. args(集合)
一个参数的集合,作为对象传递到事件监听器中。
$emit()方法返回了一个事件对象()。
从监听器中发出的一切异常都会传递到$exceptionHandler服务中。

实例scope.$emit('user:logged_in', scope.user);

$boardcast和$emit用法一样 传两个参数 name和args

scope.$broadcast('cart:checking_out', scope.cart);

3,$on是angular中的监听事件

要监听一个事件,我们可以使用$on()方法。这个方法为具有某个特定名称的事件注册了一
个监听器。事件名称就是在Angular中触发的事件类型。
例如,我们可以在路由变更过程被触发时,监听事件:
    scope.$on('$routeChangeStart',
    function(evt, next, current) {
      // 一个新的路由被触发了
    });
不管什么时候事件$routeChangeStart(路由将要变更的时候,会广播这个事件)被触发,
监听器(这个函数)都会被调用。

根据这三个方法的特性,$emit和$boardcast绑定事件name并传输数据agrs,用$on监听绑定的事件并接受数据

废话不多说直接上代码(可复制到编辑器运行)

<!DOCTYPE html>
<html lang="en" ng-app="App">
<head>
    <meta charset="UTF-8">
    <title>angular的通讯</title>
    <script src="http://zhouwei007.web3v.com/js/angular.js"></script>
</head>
<body>
    <div ng-controller="ParentCtrl">                <!--父级-->
        <div ng-controller="SelfCtrl">              <!--自己-->
            <a ng-click="click()">click me</a>
            <div ng-controller="ChildCtrl"></div>   <!--子级-->
        </div>
        <div ng-controller="BroCtrl"></div>         <!--平级-->
    </div>
</body>
<script>
    var app = angular.module('App', []);
    app.controller('SelfCtrl', function($scope) {
        $scope.click = function () {
            $scope.$broadcast('to-child', 'child','child22');
            $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);       //子级得不到值
        });
    });
    app.controller('ChildCtrl', function($scope){
        $scope.$on('to-child', function(event,data) {
            console.log('ChildCtrl', data);         //子级能得到值
        });
        $scope.$on('to-parent', function(event,data) {
            console.log('ChildCtrl', data);         //父级得不到值
        });
    });
    app.controller('BroCtrl', function($scope){
        $scope.$on('to-parent', function(event,data) {
            console.log('BroCtrl', data);          //平级得不到值
        });
        $scope.$on('to-child', function(event,data) {
            console.log('BroCtrl', data);          //平级得不到值
        });
    });
</script>
</html>

三,通过自定服务传值

angular服务的方式

在ng中服务是一个单例,所以在服务中生成一个对象,该对象就可以利用依赖注入的方式在所有的控制器中共享。

<!DOCTYPE html>
<html lang="en" ng-app="App">
<head>
    <meta charset="UTF-8">
    <title>angular的service传输数据</title>
    <script src="http://zhouwei007.web3v.com/js/angular.js"></script>
</head>
<body >
<div ng-controller="MainCtrl">
    <input type="text" ng-model="test" />
    <div ng-click="change()">click me</div>
</div>
<div ng-controller="sideCtrl" ng-click="add()">
    '数据传输'+{{name}}
</div>
</body>
<script>
    var app = angular.module('App', []);
    app.factory('instance', function(){
        return {};
    });
    app.controller('MainCtrl', function($scope, instance) {
        $scope.change = function() {
            instance.name = $scope.test;
        };
    });
    app.controller('sideCtrl', function($scope, instance) {
        $scope.add = function() {
            $scope.name = instance.name;
        };
    });
</script>
</html>

 

posted @ 2016-07-14 13:52  周围  阅读(1007)  评论(2编辑  收藏  举报