之前在做用angular写前端框架的时候很苦恼控制器之间的独立性,父级控制器可以控制子控制器,但是子控制器却很难控制父控制器。后来在用socket传递数据的时候,发现他的服务是通过emit发送,on接收。我就想angular是不是也会有这样的服务,后来试了下,果然有。
AngularJS中的作用域有一个非常有层次和嵌套分明的结构。其中它们都有一个主要的$rootScope(也就说对应的Angular应用或者ng-app),然后其他所有的作用域部分都是继承自这个$rootScope的,或者说都是嵌套在主作用域下面的。很多时候,你会发现这些作用域不会共享变量或者说都不会从另一个原型继承什么。
其中一个选择就是在应用程序作用域之中创建一个单例服务,然后通过这个服务处理所有子作用域的通信。
在AngularJS中还有另外一个选择:通过作用域中的事件处理通信。但是这种方法有一些限制;例如,你并不能广泛的将事件传播到所有监控的作用域中。你必须选择是否与父级作用域或者子作用域通信。
$on、$emit和$broadcast使得event、data在controller之间的传递变的简单。
。 $emit只能向parent controller传递event与data
。 $broadcast只能向child controller传递event与data
。 $on用于接收event与data
HTML代码:
<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>
JS 代码:
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); //子级得不到值 }); }); 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); //平级得不到值 }); });
$emit和$broadcast可以传多个参数,$on也可以接收多个参数。
相关推荐
2. **隔离性**:每个Controller都有独立的作用域,它们之间的数据不会直接互相影响,除非通过共享服务或者父子关系进行数据传递。 3. **事件广播与监听**:Controller可以通过 `$scope.$on()` 监听事件,而 `$scope....
而$scope对象则是在Controller中用来在视图和模型之间进行数据传递和同步的关键对象。 在AngularJS中,每个Controller都有自己的作用域(Scope),作用域在视图和数据模型之间扮演着中间桥梁的角色。作用域中的对象...
其次,AngularJS在实例化控制器时会自动创建一个新的作用域对象,并将其传递给控制器函数。这允许开发者在控制器中添加数据和方法,这些数据和方法随后就可以被视图所访问和使用。例如,在一个控制器函数中,我们...
这种方法适用于需要向更高级别Controller传递信息的情况。 使用`$emit`和`$on`组合时,应尽量避免在大量子作用域中触发和监听事件,因为这可能导致性能下降。为优化性能,可以考虑在$rootScope上绑定事件监听器,并...
AngularJS的核心概念之一是模块化,其中控制器(Controller)是用来增强模型(Model)与视图(View)之间的交互的。在AngularJS中,控制器是构成应用程序的主要构建块之一。 本文将分享AngularJS中控制器...
`$scope`用于在视图和控制器之间传递数据,而`$filter`则提供对所有可用过滤器的访问。我们调用`$filter('date')`,传入要格式化的日期(这里是当前日期)和所需的格式字符串('fullDate'),返回格式化后的日期,将...
AngularJS中的MVC架构将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。模型存储应用的数据,视图负责展示这些数据,而控制器处理用户交互,更新模型并反映到视图上。这种分层结构...
Controller负责接收请求,处理业务逻辑,并将结果传递给Model。Model则包含了应用程序的数据,View则根据Model的数据渲染用户界面。SpringMVC通过DispatcherServlet作为中央调度器,将请求分发到对应的Controller。 ...
* transclude 指令:在Directive之间传递数据 十二、总结 * 学习AngularJS的经验和教训 * 如何继续深入学习AngularJS 十三、深入学习AngularJS * Directive的制作和使用 * AngularJS的性能优化 * AngularJS的...
在本文中,我们将深入探讨如何在AngularJS的Controller中实现这一操作。AngularJS是一个强大的前端JavaScript框架,它提供了许多内置服务,其中之一就是$location服务,用于管理应用程序的当前URL。 首先,我们需要...
本文介绍如何利用AngularJS和RequireJS结合实现按需加载controller和directive,以减少首屏加载时间。 ### 知识点一:按需加载的概念与优势 按需加载(也称懒加载或异步加载)指的是将页面中某些不立即需要的资源...
但如果子控制器共享的是基本类型数据(例如字符串或数字),则它们之间的修改不会互相影响,因为基本类型是按值传递的。 为了演示AngularJS中控制器继承的使用方法,我们可以举一个具体的例子。假设我们有两个控制...
然而,在复杂的单页应用(SPA)中,多个Controller之间可能存在数据共享和交互的需求。AngularJS提供了一种优雅的方式来处理Controller间的通信,主要依赖于Scope的事件机制,包括`$broadcast`、`$emit`和`$on`。 1...
MVC模式中,$scope对象在AngularJS中扮演着Model的角色,它是一个普通的JavaScript对象(POJO),被用来在控制器和视图之间传递数据。 在AngularJS中,依赖注入(DI)是一个重要的概念,它是一种设计模式,允许我们...
从基础开始,AngularJS涉及到使用控制器(Controllers)来在视图(View)和模型(Model)之间传递数据。控制器是JavaScript函数,它们能够控制HTML视图的行为。当了解AngularJS的基本概念后,学习者可以开始掌握如何...
在本文中,我们将深入探讨如何使用AngularJS实现一个功能丰富的tooltip效果。AngularJS,作为一款强大的前端JavaScript框架,提供了一种高效的方式来构建动态、数据驱动的Web应用。它以其双向数据绑定、模块化和可...
在AngularJS中,每个`controller`都有一个关联的`scope`对象,它是一个包含应用数据和方法的对象,负责在控制器和视图之间传递信息。当一个`controller`被创建时,它会默认获取一个父级`controller`的`scope`副本...
当我们在创建新的控制器时,angularJS会帮我们生成并传递一个新的$scope对象给这个controller,在angularJS应用的中的任何一个部分,都有父级作用域的存在,顶级就是ng-app所在的层级,它的父级作用域就是$rootScope...