`

angular开发 控制器之间的通信

 
阅读更多

利用作用域的继承方式

由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值为基本类型的时候,修改父作用域上面的值会 影响到子作用域,反之,修改子作用域只会影响子作用域的值,不会影响父作用域上面的值;如果需要父作用域与子作用域共享一个值 的话,就需要用到后面一种,即作用域上的值为对象,任何一方的修改都能影响另一方,这是因为在js中对象都是引用类型。

基本类型

function Sandcrawler($scope) {
    $scope.location = "Mos Eisley North";
    $scope.move = function(newLocation) {
        $scope.location = newLocation;
    }
}
function Droid($scope) {
    $scope.sell = function(newLocation) {
        $scope.location = newLocation;
    }
}
// html
<div ng-controller="Sandcrawler">
    <p>Location: {{location}}</p>
    <button ng-click="move('Mos Eisley South')">Move</button>
    <div ng-controller="Droid">
        <p>Location: {{location}}</p>
        <button ng-click="sell('Owen Farm')">Sell</button>
    </div>
</div>

对象

function Sandcrawler($scope) {
    $scope.obj = {location:"Mos Eisley North"};
}
function Droid($scope) {
    $scope.summon = function(newLocation) {
        $scope.obj.location = newLocation;
    }
}
// html
<div ng-controller="Sandcrawler">
    <p>Sandcrawler Location: {{obj.location}}</p>
    <div ng-controller="Droid">
        <button ng-click="summon('Owen Farm')">
            Summon Sandcrawler
        </button>
    </div>
</div>

基于事件的方式

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

向上传播事件

function Sandcrawler($scope) {
    $scope.location = "Mos Eisley North";
    $scope.$on('summon', function(e, newLocation) {
        $scope.location = newLocation;
    });
}
function Droid($scope) {
    $scope.location = "Owen Farm";
    $scope.summon = function() {
        $scope.$emit('summon', $scope.location);
    }
}
// html
<div ng-controller="Sandcrawler">
    <p>Sandcrawler Location: {{location}}</p>
    <div ng-controller="Droid">
        <p>Droid Location: {{location}}</p>
        <button ng-click="summon()">Summon Sandcrawler</button>
    </div>
</div>

向下广播事件

function Sandcrawler($scope) {
    $scope.location = "Mos Eisley North";
    $scope.recall = function() {
        $scope.$broadcast('recall', $scope.location);
    }
}
function Droid($scope) {
    $scope.location = "Owen Farm";
    $scope.$on('recall', function(e, newLocation) {
        $scope.location = newLocation;
    });
}
//html
<div ng-controller="Sandcrawler">
    <p>Sandcrawler Location: {{location}}</p>
    <button ng-click="recall()">Recall Droids</button>
    <div ng-controller="Droid">
        <p>Droid Location: {{location}}</p>
    </div>
</div>

从这个用法我们可以引申出一种用于兄弟控制间进行通信的方法,首先我们一个兄弟控制中向父作用域触发一个事件,然后在父作用域 中监听事件,再广播给子作用域,这样通过事件携带的参数,实现了数据经过父作用域,在兄弟作用域之间传播。这里要注意的是,通过父元素作为中介进行传递的话,兄弟元素用的事件名不能一样,否则会进入死循环。请看代码:

-兄弟作用域之间传播

function Sandcrawler($scope) {
    $scope.$on('requestDroidRecall', function(e) {
        $scope.$broadcast('executeDroidRecall');
    });
}
function Droid($scope) {
    $scope.location = "Owen Farm";
    $scope.recallAllDroids = function() {
        $scope.$emit('requestDroidRecall');
    }
    $scope.$on('executeDroidRecall', function() { 
        $scope.location = "Sandcrawler"
    });
}
// html
<div ng-controller="Sandcrawler">
    <div ng-controller="Droid">
        <h2>R2-D2</h2>
        <p>Droid Location: {{location}}</p>
        <button ng-click="recallAddDroids()">Recall All Droids</button>
    </div>
    <div ng-controller="Droid">
        <h2>C-3PO</h2>
        <p>Droid Location: {{status}}</p>
        <button ng-click="recallAddDroids()">Recall All Droids</button>
    </div>
</div>

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实现控制器之间通信方式实例总结

    利用angularjs开发项目中,控制器之间的通信,比如参数的传递,数据的传递,都是比较常见的。控制器之间的通信,显得尤为重要。常见的方式有如下两种:一、angular服务的方式;二、基于事件广播的方式;另外,还有...

    AngularJS开发教程之控制器之间的通信方法分析

    本文实例讲述了AngularJS开发教程之控制器之间的通信方法。分享给大家供大家参考,具体如下: 一、指令与控制器之间通信,无非是以下几种方法: 基于scope继承的方式 基于event传播的方式 service的方式(单例模式)...

    Angular JS 权威教程

    全书 35 章,由浅入深地讲解了 AngularJS 的基本概念和 基本功能,包括模块、作用域、控制器、表达式、指令、路由、依赖注入等,重要的是书中对每一个概念 的讲解都配合了恰如其分的示例和代码,让读者通过动手实践...

    angular权威指南

    全书 35 章,由浅入深地讲解了 AngularJS 的基本概念和 基本功能,包括模块、作用域、控制器、表达式、指令、路由、依赖注入等,重要的是书中对每一个概念 的讲解都配合了恰如其分的示例和代码,让读者通过动手实践...

    详解Angualr 组件间通信

    Angualr 组件间通信 约定: 遵循Angular官方的说法,下文中的AngularJS代指1.x版本,Angular代指Angular2...在AngularJS中,也就是Angular JS 1.x版本中,我们需要实现控制器间的通信,有很多种方案,常见的有: 1. 采

    AngularJS控制器之间的数据共享及通信详解

    Directive 和 服务 Service 一类的方式,来实现数据和代码的共享和复用,但在实际的项目开发中,或许是处于懒惰,亦或是为了便利,总会想在两个控制器之间,直接进行数据的共享通信,或者是函数与方法的调用,这里...

    HybridMobileApp-Xamarin-Angular-EmbedIO:在移动应用程序内部具有REST API的本地Web服务器

    HybridMobileApp-Xamarin-Angular-EmbedIO 步骤1:使用您喜欢的C#语言进行业务逻辑和数据通信开发。 步骤2:根据需要使用Angular / React... 步骤5:使用embedio重新做仅Web api控制器部分步骤6:从您的App(App.xaml.

    ng4StarterKit:使用Angular构建大型Web应用程序的简介

    前端耦合到MVC Angular 的构建块允许我们将企业软件模式应用于前端设计系统: Angular 通过采用 TypeScript 包含模型视图控制器 (MVC) 模式和面向对象设计 (OOD)。 在考虑领域驱动设计的概念层时,问题出现了:如何...

    AngularJS权威指南.pdf 清晰中文完整版

    全书35章,由浅入深地讲解了AngularJS的基本概念和基本功能,包括模块、作用域、控制器、表达式、指令、路由、依赖注入等,重要的是书中对每一个概念的讲解都配合了恰如其分的示例和代码,让读者通过动手实践,切身...

    精通AngularJS part1

    通过$transclude在指令控制器中获取嵌入函数253 使用嵌入创建一个if指令253 在指令中使用priority属性255 93理解指令控制器256 为指令控制器注入特殊依赖257 创建一个基于控制器的分页指令258 理解指令控制器...

    Mastering Web Application Development with AngularJS

     测试控制器  Mock对象和异步代码测试  端对端测试  日常工作流  Karmarunner的提示与技巧  执行测试子集  …… 第3章 与后端服务器通信 第4章 显示与格式化数据 第5章 创建高级表单 第6章 导航 第7...

    angularJS权威指南

    全书 35 章,由浅入深地讲解了 AngularJS 的基本概念和 基本功能,包括模块、作用域、控制器、表达式、指令、路由、依赖注入等,重要的是书中对每一个概念 的讲解都配合了恰如其分的示例和代码,让读者通过动手实践,切身...

    软件定义无线电matlab源代码-LabFiles:包含我本科课程的所有源文件的存储库

    Arm微控制器编码 使用 MATLAB 进行射频系统/天线设计 高级数据结构和算法 使用 Scilab 进行控制系统工程 计算机网络与通信 使用 Angular 框架进行 Web 开发 机器人流程自动化和数据分析 使用的语言和环境: MATLAB ...

    angularjs-exercise:40 小时的 Angularjs 练习

    当您决定从事该项目时,您应该具备 AngularJS 的基本构建块(例如控制器、服务和范围)的基本知识。 您可以自由地实施该应用程序,我将为您提供一般指导和提示,以帮助您思考整个开发过程。 如果您一次只关注一个...

    ReCapProject

    该项目的前端部分使用Angular进行编码,后端部分使用Asp.net进行编码,并且使用Web API在它们之间进行通信。 MSSQL用于数据库。 :paperclip: 您在访问项目的前端部分。 使用的技术和版本 .Net Core 3.1 宁静的API ...

    ssfm:简单的小花式信使原型

    它是一个Play控制器,可根据传入数据与Akka actor一起运行Messenger模型。 Messenger的模型位于文件中。 默认情况下,Play HTTP服务器在端口9000上进行侦听,因此在开发模式下,该WebSocket在ws:// localhost:90

    Node.js 使用AngularJS的方法示例

    AngularJS强制使用MVC(模型-视图-控制器,Model-View-Controller)框架,而它又使用JavaScript对象作为它的模型,和Node.js特别般配,用AngularJS的某些服务(比如$http)和Node.js通信,交互的对象不需要被转换为...

Global site tag (gtag.js) - Google Analytics