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 相关文章推荐
js同源策略详解
May 21 Javascript
JavaScript中Boolean对象的属性解析
Oct 21 Javascript
完美实现js选项卡切换效果(一)
Mar 08 Javascript
js鼠标经过tab选项卡时实现切换延迟
Mar 24 Javascript
基于bootstrap写的一点localStorage本地储存
Nov 21 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
May 16 Javascript
angular2路由之routerLinkActive指令【推荐】
May 30 Javascript
基于vue-upload-component封装一个图片上传组件的示例
Oct 16 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
Nov 06 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
Jul 10 Javascript
js实现淘宝首页的banner栏效果
Nov 26 Javascript
vue 中使用print.js导出pdf操作
Nov 13 Javascript
巧用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
PHP中$_SERVER的详细参数与说明
2008/07/29 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
标准PHP的AES加密算法类
2015/03/12 PHP
php跨服务器访问方法小结
2015/05/12 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
Prototype ObjectRange对象学习
2009/07/19 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
webpack构建vue项目的详细教程(配置篇)
2017/07/17 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
[06:25]第二届DOTA2亚洲邀请赛主赛事第二天比赛集锦.mp4
2017/04/03 DOTA
Python 爬虫爬取指定博客的所有文章
2016/02/17 Python
Python中表示字符串的三种方法
2017/09/06 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
生产总经理岗位职责
2013/12/19 职场文书
小学生演讲稿
2014/01/12 职场文书
学校门卫管理制度
2014/01/30 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
房地产资料员岗位职责
2014/07/02 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS
Python机器学习之底层实现KNN
2021/06/20 Python