AngularJs--Scope
来源:互联网 发布:google play 知乎 编辑:程序博客网 时间:2024/06/06 08:31
一、什么是Scope?
scope(http://code.angularjs.org/1.0.2/docs/api/ng.
二、scope的特性
scope提供
scope可以在提供到被共享的model属性的访问的时候,被嵌入到独立的应用组件中。scope通过(原型),从parent scope中继承属性。
scope在expression求值之时提供上下文环境。例如,{{username}}表达式是无意义的,除非它与一个特定的定义了”username”属性的scope一起进行求值。
三、Scope as Data-Model(scope作为数据模型)
scope是在应用controller与view之间的纽带。在模版linking(http://www.cnblogs.com/lcllao/archive/2012/09/04/2669802.html)的阶段,directive(http://www.cnblogs.com/lcllao/archive/2012/09/09/2677190.html)在scope中设置
controller和directive两者都与scope有引用,但它们两者之间没有(引用)(Both controllers and directives have reference to the scope, but not to each other)。这样的安排,将controller从directive
<!DOCTYPE HTML><html lang="zh-cn" ng-app><head> <meta charset="UTF-8"> <title>data-model</title> <style type="text/css"> .ng-cloak { display: none; } </style></head><body class="ng-cloak"><div ng-controller="MyController"> 你的名字: <input type="text" ng-model="username"/> <button ng-click="sayHello()">欢迎</button> <hr/> {{greeting}}</div><script src="../angular-1.0.1.js" type="text/javascript"></script><script type="text/javascript"> function MyController($scope) { $scope.username = "My Little Dada"; $scope.sayHello = function() { $scope.greeting = "Hello~" + $scope.username + "!"; }; }</script></body></html>
在上面的例子中我们可以注意到MyController以”My Little Dada”对scope中的username属性进行赋值。然后,scope通知input进行赋值,将username的值预先填入input中。这展示了controller如何做才能够写入数据到scope中。
相似地,controller可以将行为附加在scope中,正如那个当用户点击“欢迎”按钮时触发的sayHello方法一样。sayHello方法可以读取username属性,也可以创建greeting属性。这表明,当它们绑定到HTML input控件时,scope中的属性会自动更新。
逻辑上,显示{{greeting}}涉及以下两点:
与定义了{{greeting}}表达式的模版DOM节点一起检索scope。在这个例子中,这个scope与传递到MyController中的scope是相同的。(我们在稍后将会讨论scope的层次结构)
通过之前检索的scope,对greeting表达式进行求值,然后将结果作为封闭DOM元素的text的值。
我们可以认为,scope和它自己的属性可以作为数据,用于渲染视图。scope是所有和view相关的东西单一的真相来源(The scope is the single source-of-truth for all things view related)。
从可测试性来看,controller和view的分离是值得欣喜的,因为它允许我们在没有渲染细节的干扰下(专注于)测试行为。
it('should say hello', function() { var scopeMock = {}; var cntl = new MyController(scopeMock); // Assert that username is pre-filled expect(scopeMock.username).toEqual('World'); // Assert that we read new username and greet scopeMock.username = 'angular'; scopeMock.sayHello(); expect(scopeMock.greeting).toEqual('Hello angular!');});
四、Scope Hierarchies(scope层次结构)
每一个angular应用有且只有一个root scope,但可以拥有多个child scope。
应用可以拥有多个child scope,因为一些directive会创建新的child scope(参考directive文档,查看哪些directive可创建新的scope,如ng-repeat)。当新的scope被创建后,他们将作为一个child scope,加入到parent scope中。这样,创建了一个与它们附属的DOM相似的树结构。
当angular对{{username}}求值时,它首先查看与当前元素关联的scope的username属性。如果没有找到对应的属性,它将会一直向上搜索parent scope,直到到达root scope。在javascript中,这个行为被称为“原型继承”,child scope典型地继承自它们的parent。
这个例子说明应用中的scope(是怎样的),属性的原型继承。
<!DOCTYPE HTML><html lang="zh-cn" ng-app><head> <meta charset="UTF-8"> <title>scope-hierarchies</title> <style type="text/css"> .ng-cloak { display: none; } .ng-scope { border: 1px dashed red; } </style></head><body class="ng-cloak"><div ng-controller="MyController"> 经理:{{employee.name}} [{{department}}] <br/> 报告: <ul> <li ng-repeat="employee in employee.reports"> {{employee.name}} [{{department}}] </li> </ul> <hr/> {{greeting}}</div><script src="../angular-1.0.1.js" type="text/javascript"></script><script type="text/javascript"> function MyController($scope) { $scope.department = "某部"; $scope.employee = { name:"My Little Dada", reports: [ {name:"Lcllao"}, {name:"那个谁^o^"} ] }; }</script></body></html>
注意,angular自动放置ng-scope class到与scope粘附的元素中。
<!DOCTYPE HTML><html lang="zh-cn" ng-app><head> <meta charset="UTF-8"> <title>scope-event-propagation</title> <style type="text/css"> .ng-cloak { display: none; } </style></head><body class="ng-cloak"><div ng-controller="MyController"> root scope count:{{count}} <ul> <li ng-repeat="i in [1]" ng-controller="MyController"> <button ng-click="$emit('MyEvent')">$emit("MyEvent")</button> <button ng-click="$broadcast('MyEvent')">$broadcast("MyEvent")</button> <br/> middle scope count:{{count}} <ul> <li ng-repeat="item in [1,2]" ng-controller="MyController"> Leaf scope count:{{count}} </li> </ul> </li> </ul></div><script src="../angular-1.0.1.js" type="text/javascript"></script><script type="text/javascript"> function MyController($scope) { $scope.count = 0; $scope.$on("MyEvent", function() { $scope.count++; }); }</script></body></html>
七、Scope Life Cycle(scope生命周期)
浏览器正常的事件流中,当浏览器接收到事件后,它会执行一个相应的javascript回调。一旦回调函数执行完毕后,浏览器将会重绘DOM,并返回到继续等待事件的状态。
当浏览器在angular执行环境外调用javascript代码时,这意味着angular是不知道model的改变的。要正确处理model的修改,这个命令必须通过使
在对表达式求值之后,
1) Creation(创建scope)
root scope是在应用启动的过程中,被
2) Watcher registration(注册watcher)
在模版linking过程中,directive在scope中注册$watch。这些watch将会被用作向DOM传播model的值。
3) Model mutation(Model变化)
为了让变化被正确地检测,我们需要将他们包裹在scope.
4) Mutation observation(变化监测)
在
5) Scope destruction(scope销毁)
当child scope不再是必须的时候,child scope的产生者有责任通过scope.
Scopes and Directives
在编译阶段中,compiler依靠DOM模版匹配directive。directive通常可以分为两大类:
观察型directive(Observing directives),例如dobule-curly表达式{{expression}},使用
当一个外部的事件(例如用户动作、timer或者XHR)被监听到,相关的expression必须通过$apply方法应用到scope中,让所有监听器能够正确地更新。
Directives that Create Scopes
在大多数的情况中,directive和scope是相互影响的,但不会创建新的scope实例。然而,一些directive(例如ng-controller和ng-repeat)会创建新scope,附加child scope到对应的DOM元素中。我们通过使用angular.element(aDomElement).scope()查看任意DOM元素的scope。
Controllers and Scopes
在以下的情况中,scope与controller是相互影响的:
controller使用scope暴露controller方法到模版中(查看ng-controller(http://code.angularjs.org/1.0.2/docs/api/ng.directive:ngController))。
controller定义方法(行为),可以改变model(scope上的属性)。
controller可能在model中注册watch。这些watch会在controller行为执行之后马上执行。
4. Scope
在angular中,为了检测属性的变化而对scope进行脏检测(Dirty checking),是一个普遍的操作
- AngularJS scope
- AngularJs--Scope
- AngularJS: $scope
- AngularJS 中的scope($scope)
- Angularjs中scope与$scope
- AngularJs学习笔记--Scope
- angularjs $scope.$apply()
- AngularJS and scope.$apply
- AngularJS中$scope用法
- angularjs基础—scope
- AngularJS 的 Scope
- AngularJs学习笔记--Scope
- AngularJS Scope(作用域)
- AngularJS scope destroy 详解
- AngularJS Scope(作用域)
- Angularjs Scope 详解
- AngularJS Scope 继承解析
- AngularJs学习笔记--Scope
- 安装PHP。
- [Linux内存]slab分配器学习笔记(三)--实现
- Java Web入门之EL、JSTL、自定义标签要点
- HTML表单<form>
- HDU 3345 War Chess (优先队列)
- AngularJs--Scope
- Palindromes _easy version
- 黑马程序员——集合3
- UI设计中需要注意的十二个问题 ---来自OFFIDEA DESIGN
- 玩命牛的成长记录(十一)——处理用户请求
- 使用python绘图
- Toolbar+DrawerLayout高仿网易新闻客户端
- 汉字统计
- Java类加载机制