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 相关文章推荐
url 编码 js url传参中文乱码解决方案
Apr 11 Javascript
基于Jquery实现表格动态分页实现代码
Jun 21 Javascript
JavaScript检测实例属性, 原型属性
Feb 04 Javascript
原生js实现移动端瀑布流式代码示例
Dec 18 Javascript
AngularJS手动表单验证
Feb 01 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
Mar 02 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
Aug 29 Javascript
jQuery plugin animsition使用小结
Sep 14 jQuery
vue 中的keep-alive实例代码
Jul 20 Javascript
vue3.0中的双向数据绑定方法及优缺点
Aug 01 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
Apr 10 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
PHP程序员编程注意事项
2008/04/10 PHP
PHP 各种排序算法实现代码
2009/08/20 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
2017/03/31 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
让您的菜单不离网站
2006/10/03 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
javascript连续赋值问题
2015/07/08 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
全面解析Bootstrap布局组件应用
2016/02/22 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
使用JQuery实现图片轮播效果的实例(推荐)
2017/10/24 jQuery
vue-cli2.9.3 详细教程
2018/04/23 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
vue中的适配px2rem示例代码
2018/11/19 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
Python对象转JSON字符串的方法
2016/04/27 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
Chemist Warehouse中文网:澳洲连锁大药房
2021/02/05 全球购物
奶茶店创业计划书
2014/08/14 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
七年级话题作文之执着
2019/11/19 职场文书
源码解读Spring-Integration执行过程
2021/06/11 Java/Android
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB
MySQL插入数据与查询数据
2022/03/25 MySQL