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

发布时间 - 2026-01-10 22:42:07    点击率:

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

可以看到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相关内容感兴趣的读者可查看本站专题:《AngularJS入门与进阶教程》及《AngularJS MVC架构总结》

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


# AngularJS  # ng-repeat指令  # scope  # 继承  # AngularJS深入探讨scope  # 继承结构  # 事件系统和生命周期  # 深入理解Angular.JS中的Scope继承  # 可以看到  # 类似于  # 方法来  # 进阶  # 相关内容  # 不需要  # 都能  # 遍历  # 是从  # 感兴趣  # 给大家  # 相关联  # 可以使用  # 仍然是  # 更多关于  # 中都  # 所述  # 创建一个  # 需要注意  # 程序设计 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 太平洋网站制作公司,网络用语太平洋是什么意思?  JS经典正则表达式笔试题汇总  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Android利用动画实现背景逐渐变暗  郑州企业网站制作公司,郑州招聘网站有哪些?  Laravel集合Collection怎么用_Laravel集合常用函数详解  历史网站制作软件,华为如何找回被删除的网站?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  如何快速搭建安全的FTP站点?  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  如何基于云服务器快速搭建网站及云盘系统?  Laravel如何使用Sanctum进行API认证?(SPA实战)  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  如何在Windows虚拟主机上快速搭建网站?  LinuxShell函数封装方法_脚本复用设计思路【教程】  zabbix利用python脚本发送报警邮件的方法  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Laravel如何使用withoutEvents方法临时禁用模型事件  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  详解jQuery中的事件  教你用AI将一段旋律扩展成一首完整的曲子  iOS验证手机号的正则表达式  Laravel如何优化应用性能?(缓存和优化命令)  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Android 常见的图片加载框架详细介绍  海南网站制作公司有哪些,海口网是哪家的?  北京的网站制作公司有哪些,哪个视频网站最好?  Laravel如何实现API资源集合?(Resource Collection教程)  Firefox Developer Edition开发者版本入口  Laravel Fortify是什么,和Jetstream有什么关系  网页设计与网站制作内容,怎样注册网站?  想要更高端的建设网站,这些原则一定要坚持!  Python正则表达式进阶教程_复杂匹配与分组替换解析  详解jQuery中基本的动画方法  Laravel API资源类怎么用_Laravel API Resource数据转换  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Python面向对象测试方法_mock解析【教程】  香港服务器选型指南:免备案配置与高效建站方案解析  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  UC浏览器如何设置启动页 UC浏览器启动页设置方法  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  Laravel如何处理文件下载请求?(Response示例)  Laravel如何生成API文档?(Swagger/OpenAPI教程)  LinuxCD持续部署教程_自动发布与回滚机制