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 相关文章推荐
jquery1.9 下检测浏览器类型和版本的方法
Dec 26 Javascript
js实现带有介绍的Select列表菜单实例
Aug 18 Javascript
基于JavaScript短信验证码如何实现
Jan 24 Javascript
JS+CSS3实现超炫的散列画廊特效
Jul 16 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
Jan 05 Javascript
基于Angularjs+mybatis实现二级评论系统(仿简书)
Feb 13 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
Sep 21 Javascript
Javascript 编码约定(编码规范)
Mar 11 Javascript
JS从非数组对象转数组的方法小结
Mar 26 Javascript
使用typescript开发angular模块并发布npm包
Apr 19 Javascript
Vue中props的使用详解
Jun 15 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
Aug 07 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
模拟flock实现文件锁定
2007/02/14 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
php 启动时报错的简单解决方法
2014/01/27 PHP
php中chdir()函数用法实例
2014/11/13 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
Jquery日历插件制作简单日历
2015/10/28 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
ionic实现底部分享功能
2017/05/11 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
layui输入框中只允许输入整数的实现方法
2019/09/18 Javascript
微信小程序 (地址选择1)--选取搜索地点并显示效果
2019/12/17 Javascript
JS中间件设计模式的深入探讨与实例分析
2020/04/11 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
Python查看多台服务器进程的脚本分享
2014/06/11 Python
Python实现字典去除重复的方法示例
2017/07/31 Python
python使用Tesseract库识别验证
2018/03/21 Python
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
优秀教师工作感言
2014/02/16 职场文书
北体毕业生求职信
2014/02/28 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
路政管理求职信
2014/06/18 职场文书
食堂厨师岗位职责
2014/08/25 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
2015年网络管理员工作总结
2015/05/21 职场文书
工作感言一句话
2015/08/01 职场文书
go使用Gin框架利用阿里云实现短信验证码功能
2021/08/04 Golang