`

通过angularjs的ng-repeat指令看scope的继承关系

阅读更多

ng-repeat指令的使用方式可以参考如下代码:

<!doctype html>
<html lang="en">
	<head>
	   <meta charset="utf-8">
	   <title>ng-repeat</title>
	   <script src="jquery-1.8.3.js"></script>
	   <script src="angular.js"></script>
	   <script>
			function wholeController($scope,$rootScope,$injector)
			{
				$scope.buttons = ["button1","button2","button3"];
				
				$scope.btnFunc = function(value){
					alert(value);
				};
			}
	   </script> 
	</head>
	
	<body ng-app>
		<div id="first" ng-controller="wholeController">
			<div id="buttonDiv">
				<input type="button" ng-repeat="button in buttons" id="btn{{$index}}" value="{{button}}" ng-click="btnFunc(button);"/>
			</div>
			<input type="button" value="test" ng-click="testFunc();">
		</div>	
	</body>
	
</html>

        这里需要注意:ng-click中访问button不需要使用{{button}}这种语法;而其他非angularjs环境下,必须通过{{button}}这种方式取值。ng-repeat指令中$index代表遍历的数组的索引,从0开始。
        我们知道ng-controller指令会创建一个新的作用域scope,测试代码如下:

<!doctype html>
<html lang="en">
	<head>
	   <meta charset="utf-8">
	   <title>ng-repeat</title>
	   <script src="jquery-1.8.3.js"></script>
	   <script src="angular.js"></script>
	   <script>
			//$scope是ng-controller指令新建的作用域
			function wholeController($scope,$rootScope,$injector)
			{
				alert($scope.$parent === $rootScope);//输出true
			}
	   </script> 
	</head>
	<body ng-app>
		<div id="first" ng-controller="wholeController">
		</div>	
	</body>
</html>

        我们可以使用angular.element(domElement).scope()方法来获得某一个DOM元素相关联的作用域。

<!doctype html>
<html lang="en">
	<head>
	   <meta charset="utf-8">
	   <title>ng-repeat</title>
	   <script src="jquery-1.8.3.js"></script>
	   <script src="angular.js"></script>
	   <script>
			function wholeController($scope,$rootScope,$injector)
			{
				$scope.buttons = ["button1","button2","button3"];
				
				$scope.testFunc = function(){
					 //拿到dom元素上关联的作用域
					 var scope0 = angular.element($("#btn0")[0]).scope();
					 var scope1 = angular.element($("#btn1")[0]).scope();
					 alert(scope0 == scope1);//输出false
					 
					 alert(scope0.$parent === $scope);//true
					 alert(scope1.$parent === $scope);//true
				};
			}
	   </script> 
	</head>
	
	<body ng-app>
		<div id="first" ng-controller="wholeController">
			<div id="buttonDiv">
				<input type="button" ng-repeat="button in buttons" id="btn{{$index}}" value="{{button}}" />
			</div>
			<input type="button" value="test" ng-click="testFunc();">
		</div>	
	</body>
	
</html>

        可以看到ng-repeat指令会新建作用域,而且是为循环中的每个dom元素新建一个作用域。通过F12调试,可以看到scope0和scope1的内容如下:

        可以看到scope0和scope1的$parent中都有一个buttons属性,这个属性就是从父作用域下继承得到的,很类似于javascript的原型链。

<!doctype html>
<html lang="en">
	<head>
	   <meta charset="utf-8">
	   <title>ng-repeat</title>
	   <script src="jquery-1.8.3.js"></script>
	   <script src="angular.js"></script>
	   <script>
			function wholeController($scope,$rootScope,$injector)
			{
				$scope.buttons = ["button1","button2","button3"];
				
				$scope.method1 = function(){
					 var scope0 = angular.element($("#btn0")[0]).scope();
					 scope0.buttons = ["a1","b1","c1"];
				};
				
				$scope.method2 = function(){
					 var scope0 = angular.element($("#btn0")[0]).scope();
					 scope0.$parent.buttons = ["a2","b2","c2"];
				};
				
				$scope.method3 = function(){
					var scope0 = angular.element($("#btn0")[0]).scope();
					scope0.buttons[0] = "a3";
					scope0.buttons[1] = "b3";
					scope0.buttons[2] = "c3";
				};
			}
	   </script> 
	</head>
	
	<body ng-app>
		<div id="first" ng-controller="wholeController">
			<div id="buttonDiv">
				<input type="button" ng-repeat="button in buttons" id="btn{{$index}}" value="{{button}}" />
			</div>
			<input type="button" value="method1" ng-click="method1();">
			<input type="button" value="method2" ng-click="method2();">
			<input type="button" value="method3" ng-click="method3();">
		</div>	
	</body>
	
</html>

        当点击method1、method2、method3的时候,我们希望将按钮button1、button2、button3替换掉。运行上面的代码可以发现:method2和method3都能成功达到目的,但是method1不能达到目的。原因分析如下:

        以于method2,它直接修改$parent的buttons,因此我们很容易看出它是可以达到替换的目的,调试查看$scope0如下:


        而method1的scope0.buttons = ["a1","b1","c1"];方法,会给scope0增加buttons属性并赋值(相当于重新赋值,没有改变原型),并不会影响$parents的buttons的值,所以就不能替换,如下所示:

        而对于methods方法中的scope0.buttons[0] = "a3";语句,首先会在当前作用域下找是否有buttons属性,发现没有,就会向父作用域(即JavaScript中原型链)查找,并找到了,然后修改,这里的修改实际上修改的就是$parents下的buttons,所以也生效了,如下所示:

        原因同http://bijian1013.iteye.com/admin/blogs/2221083中所说的对于原型的写有copy-on-write特性是一样的。

 

文章来源:http://blog.csdn.net/aitangyong/article/details/44086137

  • 大小: 53.9 KB
  • 大小: 78.8 KB
  • 大小: 84.9 KB
  • 大小: 91.2 KB
分享到:
评论

相关推荐

    AngularJS的ng-repeat指令与scope继承关系实例详解

    本文实例分析了AngularJS的ng-repeat指令与scope继承关系。分享给大家供大家参考,具体如下: ng-repeat指令的使用方式可以参考如下代码: &lt;!doctype html&gt; &lt;html lang=en&gt; &lt;head&gt; &lt;meta ...

    解决ng-repeat产生的ng-model中取不到值的问题

    在AngularJS中,`ng-repeat`指令用于动态地重复渲染HTML元素,这在构建复杂的列表或表单时非常有用。然而,使用`ng-repeat`时可能会遇到一个问题,即在`ng-model`中绑定的数据在JavaScript控制器中无法获取。这个...

    Hands-On With AngularJS Using ASP.NET.pdf

    5. 使用ng-init和ng-repeat指令 ng-init用于初始化应用中的数据,而ng-repeat用于遍历数组并在视图中创建重复的HTML元素。这两个指令在***中的应用将有助于动态生成表格或列表。 6. 在***应用中使用AngularJS进行...

    详解JavaScript的AngularJS框架中的作用域与数据绑定

    ng-repeat指令的每个实例都有自己的作用域,但它们都会继承父作用域。 ng-view和ng-include指令用于在单页应用中动态地加载和渲染视图,它们也会创建新的子作用域。ng-view是SPA中用于定义路由的主要指令,它在视图...

    AngularJS 0003: 指令

    AngularJS中的指令通常以`ng-`开头,如`ng-repeat`、`ng-click`等,但也可以自定义不带`ng-`前缀的指令。指令定义包括两个部分:`directiveName`和`directiveDefinition`。例如: ```javascript app.directive('...

    详解JavaScript的AngularJS框架中的作用域与数据绑定_.docx

    然而,有些指令(如`ng-repeat`)创建的孤立作用域不会直接继承父作用域的所有属性,而是只继承可枚举的属性,从而保护了父作用域的原始状态。 总的来说,AngularJS的作用域和数据绑定机制为开发者提供了强大而灵活...

    基于AngularJS实现iOS8自带的计算器

    通过ng-repeat指令,遍历$scope.data数组来动态生成按键布局,每个按键都绑定了点击事件,当用户点击时,会触发showResult函数(未在示例代码中给出,需要开发者自行实现)。 为了美观和功能性,还需要编写CSS样式...

    Angular.Js之Scope作用域的学习教程

    其他如 `ng-controller`,`ng-repeat` 等指令也会创建新的Scope,并且它们通常是其父Scope的子Scope。每个子Scope都可以通过JavaScript的原型继承机制获取到父Scope中的属性和方法。 **Scope的继承机制** 在...

    AngularJS实用开发技巧(推荐)

    8. **$scope继承**:子$scope会继承父$scope的属性和方法。 9. **$rootScope**:每个应用只有一个顶级的$rootScope,常用于全局事件监听。 10. **调试工具**:`angular.element($0).scope()`可以帮助开发者在浏览器...

    angularjs常见面试题.pdf

    - 理解MVC/MVVM架构:AngularJS基于MVVM模式,理解数据绑定、控制器、服务、指令等概念。 - 深入掌握双向数据绑定:了解脏检查机制和$digest循环。 - 知悉依赖注入:AngularJS的依赖注入系统如何工作,以及如何...

    angularjs-directives:其他 AngularJS 指令

    通过在配置对象中设置 `scope` 属性,可以创建一个独立的作用域,允许指令与外部作用域通过表达式进行数据交互。 六、指令的多例和单例 通过设置 `multiElement` 属性,可以控制指令是否能多次出现在同一元素上。而...

    angularJS学习资料总结

    2. 指令:AngularJS通过自定义HTML标签或属性扩展了HTML,这些自定义的元素称为指令,如ng-repeat、ng-if等,用于实现动态渲染和操作DOM。 3. 服务:AngularJS中的服务是一种可注入的对象,提供各种功能,如$http...

    AngularJS 最常用的功能汇总

    1. **ng-repeat指令**:ng-repeat是AngularJS中用于数据绑定的关键指令之一,它允许开发者在HTML模板中重复一段代码块以展示数组中的每个元素。ng-repeat不仅用于简单的数组,还可以用于对象数组,并且可以使用order...

    深入探究AngularJs之$scope对象(作用域)

    本文将深入探讨AngularJS中的$scope对象,包括它的作用域、如何通过指令创建、作用域的层级与继承机制。 一、作用域 AngularJS中的$scope对象是一个领域模型,它是模板的数据上下文。你可以通过在$scope对象上定义...

    AngularJS 中文Api参考手册

    7. **ng-repeat**:指令,用于迭代数组或对象,生成重复的DOM元素。 8. **ng-click**:指令,响应用户点击事件,执行关联的函数。 9. **ng-if** 和 **ng-show/ng-hide**:指令,根据表达式的值决定元素是否渲染或...

    AngularJS深入探讨scope,继承结构,事件系统和生命周期

    每当遇到如`ng-controller`这样的指令时,AngularJS会创建新的Scope实例,这些Scope通过`$parent`属性引用它们的父Scope。 例如,在`ng-controller`中创建的新Scope是由`Scope.$new()`方法生成的,而`ng-repeat`...

    angularjs-internals-slides:我的由Reveal.js制作的AngularJS Internals演示文稿的幻灯片

    例如,`ng-if`, `ng-repeat`, 和 `ng-model`等,这些指令用于条件渲染、循环和数据绑定。 3. **依赖注入**:AngularJS的依赖注入(DI)系统允许组件声明其依赖关系,而无需显式地创建对象或管理这些依赖的生命周期...

    AngularJS全局scope与Isolate scope通信用法示例

    在给定的实例中,我们看到一个`dialog` Directive,它有自己的Isolate Scope,并且通过`ng-click`指令与Controller进行通信。`on-cancel`和`on-ok`属性使用`&`修饰符,使得Isolate Scope能够调用父Scope(这里是`...

Global site tag (gtag.js) - Google Analytics