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判断函数
Aug 14 Javascript
jquery validate poshytip 自定义样式
Nov 26 Javascript
原生javascript兼容性测试实例
Jul 01 Javascript
关于javascript模块加载技术的一些思考
Nov 28 Javascript
node.js中的fs.openSync方法使用说明
Dec 17 Javascript
Function.prototype.apply()与Function.prototype.call()小结
Apr 27 Javascript
javascript特殊文本输入框网页特效
Sep 13 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
Jul 18 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
Jan 25 Javascript
简单介绍react redux的中间件的使用
Apr 06 Javascript
深入理解Vue 的钩子函数
Sep 05 Javascript
学前端,css与javascript重难点浅析
Jun 11 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
linux下使用ThinkPHP需要注意大小写导致的问题
2011/08/02 PHP
php编写的简单页面跳转功能实现代码
2013/11/27 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
改变隐藏的input中value值的方法
2014/03/19 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
jquery实现表单输入时提示文字滑动向上效果
2015/08/10 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
javascript实现非常简单的小数取整功能示例
2017/06/13 Javascript
jQuery动画_动力节点节点Java学院整理
2017/07/04 jQuery
基于jQuery中ajax的相关方法汇总(必看篇)
2017/11/08 jQuery
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
使用angular-cli webpack创建多个包的方法
2018/10/16 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
python实现无证书加密解密实例
2014/10/27 Python
Python数据类型详解(二)列表
2016/05/08 Python
python 获取list特定元素下标的实例讲解
2018/04/09 Python
Python 数据处理库 pandas进阶教程
2018/04/21 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
CSS3实现精美横向滚动菜单按钮
2017/04/14 HTML / CSS
详解html5 canvas常用api总结(二)--绘图API
2016/12/14 HTML / CSS
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
Java模拟试题
2014/11/10 面试题
十岁生日家长答谢词
2014/01/17 职场文书
计算机数据库专业职业生涯规划书
2014/02/08 职场文书
内勤主管岗位职责
2014/04/03 职场文书
公证委托书标准格式
2014/09/11 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书