(十一)通过angularjs的ng-repeat指令看scope的继承关系

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

<!doctype html>
<html lang="en">
	<head>
	   <meta charset="utf-8">
	   <title>ng-repeat</title>
	   <script src="jquery-1.11.1.js"></script>
	   <script src="angular-1.2.25.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.11.1.js"></script>
	   <script src="angular-1.2.25.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.11.1.js"></script>
	   <script src="angular-1.2.25.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中都有一个buttons属性,这个属性就是从父作用域下继承得到的,很类似于javascript的原型链。

<!doctype html>
<html lang="en">
	<head>
	   <meta charset="utf-8">
	   <title>ng-repeat</title>
	   <script src="jquery-1.11.1.js"></script>
	   <script src="angular-1.2.25.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不能达到目的。这其实很类似C语言中传值,还是传引用的问题。

var obj = {"name":"aty"};

wrongChangeName(obj);
alert(obj.name);//仍然是aty

rightChangeName(obj);
alert(obj.name);//hehe

function rightChangeName(obj)
{
	obj.name="hehe";
}

function wrongChangeName(obj)
{
	obj = {"name":"hehe"};
}

wrongChangeName就类似于我们上面的method1,而rightChangeName类似于上面的method3。也就是说如果我们想在childScope中修改parentScope中某个属性的值,那么该属性一定不能是javascript基本数据类型,一定要是对象类型。而且不能直接通过=进行赋值修改,必须是调用对象的方法来修改。

时间: 2024-12-27 18:02:37

(十一)通过angularjs的ng-repeat指令看scope的继承关系的相关文章

AngularJS开发之_指令

指令是什么?    指令是我们用来扩展浏览器能力的技术之一.在DOM编译期间,和HTML关联着的指令会被检测到,并且被执行.这使得指令可以为DOM指定行为,或者改变它. 1.指令的匹配模式 index.html : 1 <!doctype html> 2 <html ng-app="MyModule"> 3 <head> 4 <meta charset="utf-8"> 5 </head> 6 <bo

转走进AngularJs(八) ng的路由机制

走进AngularJs(八) ng的路由机制 2013-12-19 我来说两句 收藏 我要投稿 今天心情不错~,公司请了个中医来给按摩拔罐刮痧,一套下来那个爽啊~,趁着精力充沛了解了下Angular的路由机制,在此分享出来与大家共同学习. 在谈路由机制前有必要先提一下现在比较流行的单页面应用,就是所谓的single page APP.为了实现无刷新的视图切换,我们通常会用ajax请求从后台取数据,然后套上HTML模板渲染在页面上,然而ajax的一个致命缺点就是导致浏览器后退按钮失效,尽管我们可以

一招制敌 - 玩转 AngularJS 指令的 Scope (作用域),讲得特别好

学习了AngularJS挺长时间,最近再次回首看看指令这部分的时候,觉得比自己刚开始学习的时候理解的更加深入了,尤其是指令的作用域这部分. 步入正题: 每当一个指令被创建的时候,都会有这样一个选择,是继承自己的父作用域(一般是外部的Controller提供的作用域或者根作用域($rootScope)),还是创建一个新的自己的作用域,当然AngularJS为我们指令的scope参数提供了三种选择,分别是:false,true,{}:默认情况下是false. scope = false 首先我们来看

angularjs入门学习【指令篇】

一.首先我们来了解下指令API 属性 含义 restrict 申明标识符在模版中作为元素,属性,类,注释或组合,如何使用 priority 设置模版中相对于其他标识符的执行顺序 Template 指定一个字符串式的内嵌模版,如果你指定了模版是一个URL,那么是不会使用的 tempateUrl 指定URL加载的模版,如果你已经指定了内嵌的模版字符串,那么它不会使用的 Replace 如果为真,替换当前元素,如果是假或未指定,拼接到当前元素 Transclude 移动一个标识符的原始字节带你到一个新

一招制敌 - 玩转 AngularJS 指令的 Scope (作用域)【转】

学习了AngularJS好长时间,最近再次回首看看指令这部分的时候,觉得比自己刚开始学习的时候理解的更加深入了,尤其是指令的作用域这部分. 当初看的是<AngularJS权威指南>这本书,但是感觉这本书关于这方面讲的不是很细致,另外吐槽一下,这本书中文版印刷的质量不是很好,很多地方都有错误:不过讲的还是可以的,是一本学习AngularJS的好书. 下面我们就来详细分析一下指令的作用域.在这之前希望你对AngularJS的Directive有一定的了解,不然你对下面部分的理解可能会有一点难度.

AngularJS:directive自定义的指令

除了 AngularJS 内置的指令外,我们还可以创建自定义指令. 你可以使用 .directive 函数来添加自定义的指令. 要调用自定义指令,HTML 元素上需要添加自定义指令名. 使用驼峰法来命名一个指令, runoobDirective, 但在使用它时需要以 - 分割, runoob-directive: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script

AngularJS 指令的 Scope (作用域)

指令被创建AngularJS为我们指令的scope参数提供了三种选择,分别是:false,true,{}:默认情况下是false. 1.scope = false,在这种情况下,在指令模板中可以直接使用父作用域中的变量,创建的指令和父作用域(其实是同一个作用域)共享同一个model模型,所以在指令中修改模型数据,它会反映到父作用域的模型中. 2.scope = true,当把scope属性设置为true时,这表明我们创建的指令要创建一个新的作用域,这个作用域继承自我们的父作用域,它和父作用域不是

angularjs学习笔记—事件指令

angularjs学习笔记—事件指令 小俞 4.4k 3月30日 发布 推荐 4 推荐 收藏 17 收藏,11.1k 浏览 ngClick 适用标签:所有触发条件:单击 #html <div ng-controller="LearnCtrl"> <div ng-click="click()">click me</div> <button ng-click="click()">click me<

angularJs指令的Scope(作用域)

每当一个指令被创建的时候,都会有这样一个选择,是继承自己的父作用域(一般是外部的Controller提供的作用域或者根作用域($rootScope)),还是创建一个新的自己的作用域,当然AngularJS为我们指令的scope参数提供了三种选择,分别是:false,true,{}:默认情况下是false. 1.scope = false JS 代码: html 代码: result: 修改文本框的内容,两个名字都会变,实际上修改的是同一个$scope的name属性. 2. scope=true