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. (转)C++ main函数中参数argc和argv含义及用法

    原博地址:https://blog.csdn.net/dcrmg/article/details/51987413 argc 是 argument count的缩写,表示传入main函数的参数个数: ...

  2. Java - String中的==、equals及StringBuffer(转自CSDN 作者:chenrui_)

    equals是比较值/对象是否相同,==则比较的是引用地址是否相同. ==  如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象 package com.char3; public ...

  3. 《大数据日知录》读书笔记-ch16机器学习:分布式算法

    计算广告:逻辑回归 千次展示收益eCPM(Effective Cost Per Mille) eCPM= CTR * BidPrice 优化算法 训练数据使用:在线学习(online learning ...

  4. redis在Linux上的安装

    1 安装redis编译的c环境 输入命令: 注意yum安装必须联网 yum install gcc-c++  如果提示是否需要下载输入y就可以开始下载. 2 redis安装 1 上传文件 2 解压文件 ...

  5. Respone笔记

    1 设置定时刷新的头 //设置定时刷新的头 response.setHeader("refresh", "5;url=http://www.baidu.com" ...

  6. iOS 系统架构及常用框架(iOS的系统架构分为四个层次)

    1.iOS基于UNIX系统,因此从系统的稳定性上来说它要比其他操作系统的产品好很多 2.iOS的系统架构分为四层,由上到下一次为:可触摸层(Cocoa Touch layer).媒体层(Media l ...

  7. 面试题目: 获取服务器IP和客户端IP

    [面试题目] 怎么获取服务器IP和客户端IP地址? I. PHP获取客户端IP, 可通过下面系统变量 1. $_SERVER['Remote_Addr'] 2. $_SERVER['HTTP_CLIE ...

  8. shiro的授权

    1.授权的流程 2.三种授权方式 1.编程式:通过写if/else 授权代码块完成: Subject subject = SecurityUtils.getSubject(); if(subject. ...

  9. Centos7 ftp服务器搭建

    1.使用yum安装ftp服务端: yum install -y vsftpd 2.使用yum安装ftp客户端: yum install -y ftp.x86_64 3.开启ftp服务设置开机启动并查看 ...

  10. touch-slide-image

    用htmls5+css3实现的在android和ios,以及wekit新版浏览器上实现手指滑动切换图片. https://github.com/navyxie/touch-slide-image