`

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>
分享到:
评论

相关推荐

    angular中实现控制器之间传递参数的方式

    本文将详细介绍两种在Angular中实现控制器之间传递参数的方法。 1. **通过$rootScope传参** AngularJS的作用域采用原型链机制,因此在子作用域中无法直接访问的属性,会向上级作用域查找。$rootScope作为所有控制...

    Laravel开发-angular2

    在IT行业中,Laravel和Angular2是两个非常重要的框架,分别在后端和前端开发领域具有广泛的应用。本文将深入探讨这两个技术栈的结合,以及如何利用它们进行高效的Web应用程序开发。 **Laravel开发** Laravel是一款...

    Laravel开发-laravel-angular

    Laravel 提供了一系列强大的工具,如路由、控制器、模型、视图、数据库ORM(Eloquent)、模板引擎(Blade)、任务调度、队列处理和邮件服务等,这些都极大地简化了开发者的工作流程。它遵循 MVC(Model-View-...

    Laravel和 Angular JS开发全栈知乎

    - **控制器编写**:为每个功能编写对应的控制器,处理业务逻辑并返回相应的数据或视图。 - **API接口开发**:基于RESTful API规范,开发出供前端调用的API接口。 #### 四、关键技术点解析 ##### 4.1 双向数据绑定 ...

    Angular.js中控制器之间的传值详解

    在实际开发中,推荐使用服务来实现控制器间的通信,因为这种方式更符合Angular的设计模式,可以提供清晰的API,方便调试和长期维护。同时,通过服务,可以轻松实现数据的缓存、异步操作和数据的统一管理。避免过度...

    javascript控件开发之页面控制器

    1. 页面控制器的源码文件:这些文件可能包含了JavaScript代码,展示了如何初始化控制器、处理路由、管理页面状态以及与其他组件通信。 2. HTML模板文件:可能包含了一些静态或动态生成的页面结构,它们与JavaScript...

    AngularJS控制器之间的通信方式详解

    通过使用Angular服务,我们可以创建共享的业务逻辑、状态管理或数据访问等代码,使得控制器之间可以以非常灵活的方式进行通信。 Angular服务的通信示例: 可以创建一个服务来存储共享数据,控制器可以注入这个服务...

    angular-1.7.2源码

    6. **服务**(Services):AngularJS中的服务是单例的,可以用来存储数据、提供功能或者进行跨控制器通信。常见的内置服务有`$http`(处理HTTP请求)、`$rootScope`(全局作用域)等。 7. **过滤器**(Filters):...

    Angular-Client

    "Angular-Client" 提供的是Angular官方的一个英雄客户端示例,旨在帮助初学者快速入门并熟悉Angular开发环境的搭建。 1. **Angular 框架基础** Angular 是一个全面的、MVC(模型-视图-控制器)架构的前端框架,它...

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

    **父控制器通信**: 若两个控制器共享同一个父控制器,则可以利用父控制器作为中介来传递数据。父控制器可以持有并共享数据给其子控制器。 **$window 和 $localStorage**: AngularJS提供了对JavaScript全局对象...

    Angular-从控制器调用指令方法

    然而,在实际开发过程中,有时我们需要从控制器中调用指令的方法,实现更复杂的交互。这篇技巧文章的核心内容就是解决这个问题。 AngularJS中的指令是一种强大的特性,它们允许我们定义新的HTML元素或属性,甚至...

    Angularjs实现控制器之间通信方式实例总结

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

    Angular 5 WebSocket 聊天室_前端

    **Angular 5 WebSocket 聊天室:前端技术详解** 在现代Web开发中,实时通信已经成为...通过这个项目,开发者不仅可以学习到如何在Angular中使用WebSocket,还能深入了解组件化开发、状态管理以及实时通信的实践应用。

    Angular外部使用js调用Angular控制器中的函数方法或变量用法示例

    在当前的Web开发实践中,Angular作为一个流行的前端框架,提供了一种组织和管理复杂应用程序...在可能的情况下,应当优先考虑使用Angular提供的服务(Service)或工厂(Factory)等机制来在控制器之间进行通信和数据传递。

    迈向angular 2 + 文档

    开发者只需通过文档左侧的导航栏中的语言选择器即可切换开发语言。 - **概览**:快速入门中的示例通常会包含一个实际的Angular应用结构,通过点击在线示例链接可以在Plunker中互动地测试这些示例。这有助于开发者...

    AngularJS实用开发技巧(推荐)

    5. **控制器间通信**:避免直接互相调用,通过事件机制或服务进行通信。 6. **利用指令复用视图**:自定义指令可以封装重复的视图结构和行为。 7. **$scope结构**:$scope是树形结构,与DOM平行,用于存储应用的状态...

    angular-1.8.2.zip

    2. **控制器**:控制器是应用程序逻辑的主要载体,它们通过注入服务并与视图进行交互来处理用户输入。 3. **指令**:AngularJS的独特之处在于它的自定义HTML指令,这些指令扩展了HTML的功能,允许开发者创建交互式...

    angular+springmvc+mongodb

    - **模型-视图-控制器**:Spring MVC 将应用程序逻辑分为模型、视图和控制器三个部分,提高了代码组织和维护性。 - **依赖注入**:与 Angular 类似,Spring 也支持依赖注入,使得对象之间的依赖关系更易于管理和测试...

    Angular2 入门 中文WORD版

    Angular2 是一款由Google维护的前端开发框架,用于构建高性能、可维护的单页应用程序(SPA)。这个"Angular2 入门 中文WORD版"很可能是一份详细的教程文档,旨在帮助初学者掌握Angular2的基本概念和核心功能。下面将...

    ssh+angular+bootstrap 博客

    它简化了后端服务的开发,提供了模型的管理、视图的渲染以及控制器的处理。 3. **Hibernate**:这是一个流行的Java ORM(对象关系映射)工具,允许开发者用面向对象的方式操作数据库。它简化了数据访问,减少了与...

Global site tag (gtag.js) - Google Analytics