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


Posted in Javascript onJanuary 21, 2017

本文实例分析了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的内容如下:

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

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

可以看到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基本数据类型,一定要是对象类型。而且不能直接通过=进行赋值修改,必须是调用对象的方法来修改。

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
Javascript代码混淆综合解决方案-Javascript在线混淆器
Dec 18 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
Nov 15 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
Mar 31 Javascript
jquery获取select选中值的方法分析
Dec 22 Javascript
D3.js实现雷达图的方法详解
Sep 22 Javascript
快速解决js开发下拉框中blur与click冲突
Oct 10 Javascript
JS中使用media实现响应式布局
Aug 04 Javascript
swiper 解决动态加载数据滑动失效的问题
Feb 26 Javascript
Vue组件间通信 Vuex的用法解析
Aug 05 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
Mar 09 Javascript
JavaScript实现弹出窗口效果
Dec 09 Javascript
vue使用localStorage持久性存储实现评论列表
Apr 14 Vue.js
巧用canvas
Jan 21 #Javascript
javascript阻止事件冒泡和浏览器的默认行为
Jan 21 #Javascript
js验证手机号、密码、短信验证码代码工具类
Jun 24 #Javascript
微信小程序 swiper制作tab切换实现附源码
Jan 21 #Javascript
微信小程序之拖拽排序(代码分享)
Jan 21 #Javascript
微信小程序 利用css实现遮罩效果实例详解
Jan 21 #Javascript
JavaScript数组去重的6个方法
Jan 21 #Javascript
You might like
Phpbean路由转发的php代码
2008/01/10 PHP
php面向对象全攻略 (五) 封装性
2009/09/30 PHP
关于php正则匹配汉字的方法介绍
2013/04/25 PHP
php使用codebase生成随机数
2014/03/25 PHP
使用XHProf查找PHP性能瓶颈的实例
2017/12/13 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
js下弹出窗口的变通
2007/04/18 Javascript
简单的js分页脚本
2009/05/21 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
2011/12/11 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
Javascript中的 “&amp;” 和 “|” 详解
2017/02/02 Javascript
原生JS实现日历组件的示例代码
2017/09/22 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
nodejs环境使用Typeorm连接查询Oracle数据
2019/12/05 NodeJs
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
js实现电灯开关效果
2021/01/19 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
Python易忽视知识点小结
2015/05/25 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
python中的colorlog库使用详解
2019/07/05 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
推荐WEB开发者最佳HTML5和CSS3代码生成器
2015/11/24 HTML / CSS
迪奥美国官网:Dior美国
2019/12/07 全球购物
给同事的道歉信
2014/01/11 职场文书
鉴史问廉观后感
2015/06/10 职场文书
客户答谢会致辞
2015/07/30 职场文书