angular开发控制器之间的通信

一、指令与控制器之间通信,无非是以下几种方法:

  基于scope继承的方式
  基于event传播的方式
  service的方式(单例模式)

二、基于scope继承的方式:

  最简单的让控制器之间进行通信的方法是通过scope的继承。假设有两个控制器Parent、Child,Child 在 Parent 内,那Child 可以称为控制器Parent的子控制器,它将继承父控制器Parent的scope。这样,Child就可以访问到Parent的scope中的所有函数和变量了。

  需要注意的是,由于scope的继承是基于Js的原型继承,如果变量是基本类型的,那在Child中的修改(写),有可能会导致Parent中的数据变脏。

  例子:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>基于scope继承的方式</title>
</head>
<body ng-app = "myApp">
    <div ng-controller = "parent">
            <p>引用类型:{{obj.value}}</p>
            <p>引用类型:{{value}}</p>
            <a href="javascript:;" ng-click = "parent('parent')">点我</a>
        <div ng-controller="child">
            <p>引用类型:{{obj.value}}</p>
            <p>引用类型:{{value}}</p>
            <a href="javascript:;" ng-click = "child('child')">点我</a>            
        </div>
    </div>

    <script type="text/javascript" src='http://cdn.staticfile.org/angular.js/1.3.0-beta.13/angular.min.js'></script>
    <script>
        var app = angular.module("myApp",[],function(){console.log("start")});
        app.controller("parent",function($scope){
            $scope.parent = function(newchild){
                // 这里不能都单独写成$scope.obj={value:newchild}
                $scope.obj={value:newchild};
                $scope.value = newchild;
            }
        });
        app.controller("child",function($scope){
            $scope.child = function(newchild){
                $scope.value = newchild;
                $scope.obj.value=newchild;
            }

        });
    </script>
</body>
</html>

三、基于事件的方式:

  在一般情况下基于继承的方式已经足够满足大部分情况了,但是这种方式没有实现兄弟控制器之间的通信方式,所以引出了事件的方式 。基于事件的方式中我们可以里面作用的$on,$emit,$boardcast这几个方式来实现,其中$on表示事件监听,$emit表示向父级以上的 作用域触发事件, $boardcast表示向子级以下的作用域广播事件。

  子到父 通过 $emit 注册事件,例子:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>基于事件传播子到父</title>
</head>
<body ng-app = "myApp">
    <h3>$on,$emit,$boardcast这几个方式来实现,其中$on表示事件监听,$emit表示向父级以上的 作用域触发事件, $boardcast表示向子级以下的作用域广播事件</h3>
    <div ng-controller = "parent">
            <p>引用类型:{{value}}</p>
        <div ng-controller="child">
            <a href="javascript:;" ng-click = "child('child')">子传值到父</a>            
        </div>
    </div>

    <script type="text/javascript" src='http://cdn.staticfile.org/angular.js/1.3.0-beta.13/angular.min.js'></script>
    <script>
        var app = angular.module("myApp",[],function(){console.log("start")});
        app.controller("parent",function($scope){
            $scope.$on("pfan",function(e,data){
                $scope.value = data;
            })
                
        });
        app.controller("child",function($scope){
            $scope.child = function(newchild){
                $scope.value = newchild;
                $scope.$emit("pfan",$scope.value)
            }

        });
    </script>
</body>
</html>

  父到子通过$broadcast注册事件,但其实感觉有点多余,本事父就是可以共享给子的,例子:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>基于事件传播父到子</title>
</head>
<body ng-app = "myApp">
    <h3>$on,$emit,$boardcast这几个方式来实现,其中$on表示事件监听,$emit表示向父级以上的 作用域触发事件, $boardcast表示向子级以下的作用域广播事件</h3>

    基于事件传播父到子,这里本事父就可以到子,感觉有点多余
    <div ng-controller = "parent">
            <a href="javascript:;" ng-click = "parent('child')">子传值到父</a>    
            
        <div ng-controller="child">
            <p>引用类型:{{value}}</p>        
        </div>
    </div>

    <script type="text/javascript" src='http://cdn.staticfile.org/angular.js/1.3.0-beta.13/angular.min.js'></script>
    <script>
        var app = angular.module("myApp",[],function(){console.log("start")});
        app.controller("parent",function($scope){
            $scope.parent = function(newchild){
                $scope.value = newchild;
                $scope.$broadcast("pfan",$scope.value)
            }
                
        });
        app.controller("child",function($scope){
            $scope.$on("pfan",function(e,data){
                $scope.value = data;
            })

        });
    </script>
</body>
</html>

  同级之间

  拥有同个父scope的子级scope之间,也就是兄弟/相邻scope之间的通信,其实是借助共同父级传递消息的:

  子级scope中有谁想传消息了,$emit 一个给“奶爸”
  然后通过“奶爸” $broadcast 给所有孩子这个相同的信息,当然发出信息的那个可以选择是否要忽略掉自己发出的信息

四、angular服务的方式:

  在ng中服务是一个单例,所以在服务中生成一个对象,该对象就可以利用依赖注入的方式在所有的控制器中共享。参照以下例子,在一个控制器修改了服务对象的值,在另一个控制器中获取到修改后的值:

var app = angular.module('myApp', []);
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;
    };
});
//html
<div ng-controller="MainCtrl">
     <input type="text" ng-model="test" />
     <div ng-click="change()">click me</div>
</div>
<div ng-controller="sideCtrl">
    <div ng-click="add()">my name {{name}}</div>
</div>

 

 

参考资料:

  AngularJs开发——控制器间的通信

  angular开发 控制器之间的通信

  AngularJS: 使用Scope时的6个陷阱

转载于:https://www.cnblogs.com/pingfan1990/p/5043880.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 装饰器是 Angular一个重要的特性,它可以帮助开发者给应用程序添加元数据,并且还可以帮助开发者更好地维护和扩展应用程序。 1. 装饰器可以帮助开发者更方便地定义组件,因为装饰器可以将所有相关的元数据放在一起。 2. 装饰器可以帮助开发者更方便地添加路由,因为开发者可以在组件的装饰器中直接定义路由规则。 3. 装饰器还可以帮助开发者更方便地管理服务,因为开发者可以在装饰器中直接定义服务的注入规则。 4. 装饰器还可以帮助开发者更方便地定义管道,因为开发者可以在装饰器中直接定义管道的转换规则。 5. 装饰器还可以帮助开发者更方便地定义指令,因为开发者可以在装饰器中直接定义指令的行为。 6. 装饰器还可以帮助开发者更方便地处理输入和输出属性,因为开发者可以在装饰器中直接定义属性的绑定规则。 7. 装饰器还可以帮助开发者更方便地管理组件的生命周期,因为开 ### 回答2: Angular装饰器是一种特殊的注解,用于修饰类、方法、属性或参数,并提供了一些附加功能和元数据。以下是10个使用Angular装饰器的例子及其好处: 1. @Component:将类声明为组件,并提供了模板、样式和逻辑代码的组织方式。使代码结构清晰易懂。 2. @NgModule:将类声明为模块,用于导入和组织各个组件及服务。使代码模块化,并提供依赖注入的能力。 3. @ViewChild:用于在组件中获取子组件或DOM元素的引用。简化了组件之间通信方式。 4. @Input:用于接收父组件传递的数据。方便实现组件之间的数据共享与交流。 5. @Output:用于向父组件发送消息或触发事件。简化了组件之间的事件处理方式。 6. @Injectable:用于标记服务类,使其可以被依赖注入系统所管理。方便实现组件和服务的解耦。 7. @Pipe:用于创建过滤器,用于对数据进行转换或格式化。提高了代码的可重用性和可维护性。 8. @Directive:用于创建自定义指令,扩展HTML元素的行为和样式。使代码更具灵活性和可扩展性。 9. @HostListener:用于在宿主元素上绑定事件监听器。简化了对DOM事件的处理方式。 10. @HostBinding:用于将属性绑定到宿主元素的属性。简化了对DOM属性的控制方式。 总的来说,Angular装饰器能够提供一种声明式的方式来改变类的行为或属性,在开发时能够提高代码的可读性、可维护性和可扩展性。 ### 回答3: Angular装饰器是一种用于增强类、方法、属性或参数的元编程特性。它们有以下十个好处: 1. 简化代码:装饰器使代码更整洁和易读,通过将相同功能的逻辑集中在一处,减少了代码的重复。 2. 模块化:装饰器允许将不同的功能封装为独立的模块,便于组织和管理代码。 3. 可重用性:通过装饰器可以实现可复用的功能模块,减少了代码的冗余,并且可以在多个地方使用。 4. 扩展性:装饰器可以轻松地扩展类或对象的功能,无需修改原始代码。 5. 灵活性:装饰器可以根据需要动态地添加或移除功能,使代码更加灵活。 6. 可组合性:不同的装饰器可以组合使用,形成更复杂的功能,并且可以根据需求进行定制。 7. 可测试性:装饰器使代码的功能更加模块化,易于测试和调试。 8. 可维护性:通过装饰器,不同的功能模块可以独立开发和维护,使代码更易于维护和升级。 9. 可扩展性:装饰器可以与其他第三方库或框架无缝集成,提供更多功能扩展选项。 10. 可插拔性:装饰器可以方便地将新的功能插入到已有代码中,无需修改原有功能的实现代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值