angular.element($0).scope()

什么是scope?

scope是一个refer to the application model的object。它是一个expression的执行上下文context。scopes模仿DOM的层次模型也有层次关系。Scopes可以watch一个expression也可以propagate events。

scope特性

scope提供API $watch来观察模型的变化

scope提供API $apply来传播angular外部世界(比如controller,service,event handler)造成的模型变更到系统中的各个view.

scopes可以嵌套,嵌套的scope要么是child scope或者isolated scope.一个child scope将从parent scope中继承属性,而isolated scope则不会。

scope提供了一个表达式执行的context。比如{{username}}这个表达式,除非给定一个定义了username属性的scope,否则是没有意义的。

scope作为data-model

scope是应用程序的controller和view之间的接口。在template linking阶段,directives建立起$watch expressions on the scope. $watch允许directives被通知到任何属性的变更,这样就允许一个directive来渲染变更过的数据到DOM上。

controller和directive都会引用到scope,但又不完全雷同。这个安排的好处是将controller从directive或者从DOM处隔离开来。这将使得controller和view无关,而这将大大增强应用的可测试性。

<div ng-controller="MyController">
Your name:
<input type="text" ng-model="username">
<button ng-click='sayHello()'>greet</button>
<hr>
{{greeting}}
</div>
angular.module('scopeExample', [])
.controller('MyController', ['$scope', function($scope) {
$scope.username = 'World'; $scope.sayHello = function() {
$scope.greeting = 'Hello ' + $scope.username + '!';
};
}]);

在上面的例子中,MyController给scope对象的username属性赋值为World。然后scope对象将通知和username绑定的input元素,它会将username的值渲染出来。这演示了controller如何能够向scope对象写一个属性。

类似的,controller可以向scope来赋值一个sayHello方法,这个方法将在用户点击greet button时被调用。sayHello方法然后读取username属性并且创建一个greeting属性。这又演示了scope的属性当他们被绑定给input widgets时将随着用户的输入自动更新

逻辑上说:{{greeting}}的渲染包含:

获取template中{{greeting}}的定义所在的DOM节点相关联的scope对象。在这个例子中,这个scope是和传递给MyController相同的scope;

在上面获取到的scope上下文中,Evaluate {{greeting}}表达式,并且将其值赋值给enclosing DOM element的text节点

你可以把scope和它的属性想象成用于渲染视图的数据。scope是所有视图相关的唯一数据源。

另外,从测试的角度说,控制器和视图分离是有必要的,因为它允许我们在不用关心渲染细节的基础上做好测试。

scope层次关系

每一个angular的应用程序只有一个root scope,但是可能有多个子scope

应用程序可以有多个scope,因为一些directive会创建新的子scope。当新的scope被创建时,他们被添加为它的父scope的子孙。这样就创建了一个和他们所相关的DOM平行的树型结构

当angular evaluate {{name}}时,它首先查看和相关html元素相关联的元素是否有name属性。如果没有发现Name属性,它则查找parent scope直到root scope.在javascript中,这个行为被称为prototypical inheriteance,而子scope prototypically inherit from their parents.

https://docs.angularjs.org/guide/scope

angular中的scope的更多相关文章

  1. Angular 中得 scope 作用域梳理

    $scope 的使用贯穿整个 Angular App 应用,它与数据模型相关联,同时也是表达式执行的上下文.有了 $scope 就在视图和控制器之间建立了一个通道,基于作用域视图在修改数据时会立刻更新 ...

  2. Angular中directive——scope选项与绑定策略,这个也经常迷惑的。

    开门见山地说,scope:{}使指令与外界隔离开来,使其模板(template)处于non-inheriting(无继承)的状态,当然除非你在其中使用了transclude嵌入,这点之后的笔记会再详细 ...

  3. angular源码分析:angular中$rootscope的实现——scope的一生

    在angular中,$scope是一个关键的服务,可以被注入到controller中,注入其他服务却只能是$rootscope.scope是一个概念,是一个类,而$rootscope和被注入到cont ...

  4. angular中的代码执行顺序和$scope.$digest();

    angular中,在一个controller里$scope.whatever=function(){...} ,这样写只是在这个scope作用域里定义了一个函数,如果要执行的话还得在这个control ...

  5. angular 中父元素ng-repeat后子元素ng-click失效

    在angular中使用ng-repeat后ng-click失效,今天在这个上面踩坑了.特此记录一下. 因为ng-repeat创造了新的SCOPE.如果要使用这个scope的话就必须使用$parent来 ...

  6. angular中的compile和link函数

    angular中的compile和link函数 前言 这篇文章,我们将通过一个实例来了解 Angular 的 directives (指令)是如何处理的.Angular 是如何在 HTML 中找到这些 ...

  7. Deferred在jQuery和Angular中的使用与简单实现

    Deferred在jQuery和Angular中的使用与简单实现 Deferred是在jQuery1.5版本中加入的,并且jQuery使用它完全重写了AJax,以前也只是偶尔使用.但是上次在使用Ang ...

  8. angular源码分析:angular中脏活累活的承担者之$interpolate

    一.首先抛出两个问题 问题一:在angular中我们绑定数据最基本的方式是用两个大括号将$scope的变量包裹起来,那么如果想将大括号换成其他什么符号,比如换成[{与}],可不可以呢,如果可以在哪里配 ...

  9. angular源码分析:angular中入境检察官$sce

    一.ng-bing-html指令问题 需求:我需要将一个变量$scope.x = '<a href="http://www.cnblogs.com/web2-developer/&qu ...

随机推荐

  1. Map.Entry使用详解

    1.Map.Entry说明 Map是java中的接口,Map.Entry是Map的一个内部接口. Map提供了一些常用方法,如keySet().entrySet()等方法,keySet()方法返回值是 ...

  2. mysql入门与进阶

    MySQL入门与进阶 需求:对一张表中的数据进行增删改查操作(CURD) C:create 创建 U:update 修改 R:read 读|检索 查询 D:delete 删除涉及技术:数据库 1.数据 ...

  3. java中+=与+的区别

    public class QQ { public static void main(String[] args) throws ParseException { byte val1 = 5; doub ...

  4. CSAPP阅读笔记-struct, union, 数据对齐-来自第三章3.9的笔记-P183-P191

    1.数据对齐 为什么要对齐:通俗点解释就是CPU对数据访问时,每次都是取固定数量的字节数,假如一次取4个字节,若有个int存在0x01-0x04,则一次就能取出,若存在0x03-0x06,则需要分两次 ...

  5. 使用discover批量执行用例

    TestLaoder 该类负责根据各种条件加载测试用例,并将它们返回给测试套件,正常情况下,不需要创建这个类的实例,unittest提供了可以共享的defaultTestLoader类,可以使用其子类 ...

  6. Orcale 之 SQL 数据定义

    SQL 的数据定义功能主要是针对数据对象进行定义的,这些数据对象主要包括:表,视图以及索引. 注意:由于视图是基于表的虚表,而索引是依附在基表上的,所以视图和索引均不提供修改视图和索引定义的操作.如果 ...

  7. Unity热更方案汇总

    http://www.manew.com/thread-114496-1-1.html   谈到目前的代码热更方案:没什么特别的要求   <ignore_js_op>    toLua(效 ...

  8. Java的IO流各个类的使用原则

    参考:http://blog.csdn.net/ilibaba/article/details/3955799 Java IO 的一般使用原则(花多眼乱,其实每个类都有专门的作用): 这里有详细介绍: ...

  9. ORM框架SQLAlchemy的使用

    ORM和SQLAlchemy简介 对象关系映射(Object Relational Mapping,简称ORM),简单的来说,ORM是将数据库中的表与面向对象语言中的类建立了一种对应的关系.然后我们操 ...

  10. 深入理解JavaScript系列(46):代码复用模式(推荐篇)

    介绍 本文介绍的四种代码复用模式都是最佳实践,推荐大家在编程的过程中使用. 模式1:原型继承 原型继承是让父对象作为子对象的原型,从而达到继承的目的: function object(o) { fun ...