全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解angularJs中自定义directive的数据交互

 就我对directive的粗浅理解,它一般用于独立Dom元素的封装,应用场合为控件重用和逻辑模块分离。后者我暂时没接触,但数据交互部分却是一样的。所以举几个前者的例子,以备以后忘记。

directive本身的作用域$scope可以选择是否封闭,不封闭则和其controller共用一个作用域$scope。例子如下:

<body ng-app="myApp" ng-controller="myCtrl">
<test-directive></test-directive>
<script>
  angular.module("myApp",[])
      .controller("myCtrl",function($scope){
        $scope.data = {
          name:"白衣如花"
        };
      })
      .directive("testDirective",function(){
        return {
          restrict:"E",
          template:"<h1>{{data.name||'未定义'}}</h1>"
        }
      });
</script>
</body>

显示结果为:白衣如花,可以知道directive中的data.name就是myCtrl控制器中的$scope.data.name。 

  那么封闭的directive呢?怎么封闭,封闭效果是什么样的,封闭后怎么数据交互?这些都是我这几天摸索的东西。

<body ng-app="myApp" ng-controller="myCtrl">
<test-directive></test-directive>
<script>
  angular.module("myApp",[])
      .controller("myCtrl",function($scope){
        $scope.data = {
          name:"白衣如花"
        };
      })
      .directive("testDirective",function(){
        return {
          restrict:"E",
          scope: {},
          template:"<h1>{{data.name||'未定义'}}</h1>"
        }
      });
</script>
</body>

结果显示为:未定义。所以在directive定义时,添加属性scope就可以把directive的作用域和父控制器的作用域分离开来。

好,了解了开放和封闭之后,进入主题,如何进行数据交互。个人觉得数据交互分为:父控制器获取directive的变量;directive获取父控制器的变量;父控制器调用directive的函数;directive调用父控制器的函数。

1.父控制器获取directive的变量。比如封装了一个输入框接受用户输入,父控制器点击搜索按钮要获取用户输入:

<body ng-app="myApp" ng-controller="myCtrl">
<p>名字:{{outerName}}</p>
<test-directive inner-name="outerName"></test-directive>
<script>
  angular.module("myApp",[])
      .controller("myCtrl",function($scope){
      })
      .directive("testDirective",function(){
        return {
          restrict:"E",
          scope: {
            innerName: "="
          },
          template:"<input type='text' ng-model='innerName' placeholder='白衣如花'>"
        }
      });
</script>
</body>

显示结果如下:

分析:从数据流向说起,testDirective中的一个input输入绑定在innerName中,innerName是directive私有作用域拥有的变量,外部控制器不能直接用。通过innerName: "="传递给html中的inner-name属性,

而inner-name属性则绑定在外部控制器的outerName变量中,所以最后显示在最上面的<p>标签内。上述代码等价于如下代码:

<test-directive name="outerName"></test-directive>
scope: {
  innerName: "=name"
},

由inerName: "="变成了innerName: "=name",而html属性绑定也由inner-name变成了name。

 2.directive获取父控制器的变量。这个应用场合应该挺多的,比如公共的页眉页脚,公共的展示面板等。

这个用上面例子的"="一样可以实现,于是我们知道了"="是双向绑定。但是我们要防止directive内部意外修改数据该怎么办呢?于是单向绑定"@"就出场了。

<body ng-app="myApp" ng-controller="myCtrl">
<input type='text' ng-model='outerName' placeholder='白衣如花'>
<test-directive inner-name="{{outerName}}"></test-directive>
<script>
  angular.module("myApp",[])
      .controller("myCtrl",function($scope){
      })
      .directive("testDirective",function(){
        return {
          restrict:"E",
          scope: {
            innerName: "@"
          },
          template:"<p>名字:{{innerName}}</p>" +
          "<button ng-click='innerName=innerName+1'>点击</button>"
        }
      });
</script>
</body>

值得注意的是:@在html的属性绑定时需要{{}}开标识,而=则不用。我的理解是,对于父控制器而言,@是数据传递,而=是数据绑定,所以有这些区别。directive中加入了一个按钮用于验证修改数据后

父控制器是否发生改变,结果是=有变化,@无变化,很容易得出结论:=是双向绑定,@是双向绑定。

 3.directive调用父控制器的函数。应用场合,暂时想不到(汗)。

变量用=和@来传递,函数则用&。例子如下:

<body ng-app="myApp" ng-controller="myCtrl">
<p>名字:{{outerName}}</p>
<test-directive on-click="click(name)"></test-directive>
<script>
  angular.module("myApp",[])
      .controller("myCtrl",function($scope){
        $scope.click = function (name) {
          $scope.outerName = name || "白衣如花";
        }
      })
      .directive("testDirective",function(){
        return {
          restrict:"E",
          scope: {
            onClick: "&"
          },
          template:"<input type='text' ng-model='innerName' placeholder='白衣如花'>" +
          "<button ng-click='onClick({name: innerName})'>点击</button>"
        }
      });
</script>
</body>

数据传递流程和之上的例子差不多,唯一要注意的是参数传递时,{name: innerName}前者是形参,后者是实参。多个参数时,参数顺序不重要,形参一一对应。

4.父控制器调用directive的函数。这个是前段时间遇到的难点,情况较其他复杂一些。应用场合也很普遍,比如初始化,重置等。

<body ng-app="myApp" ng-controller="myCtrl">
<button ng-click="click()">重置</button>
<test-directive action="action"></test-directive>
<script>
  angular.module("myApp",[])
      .controller("myCtrl",function($scope){
        $scope.action = {};
        $scope.click = function () {
          $scope.action.reset();
        }
      })
      .directive("testDirective",function(){
        return {
          restrict:"E",
          scope: {
            action: "="
          },
          template:"<input type='text' ng-model='name' placeholder='白衣如花'>",
          controller: function ($scope) {
            $scope.action.reset = function () {
              $scope.name = "白衣如花"
            }
          }
        }
      });
</script>
</body>

又一次用到了=,利用了js中函数也是属性的原理。似乎,理解了=的双向绑定,就很容易调用directive内部函数了。但是初始化呢?

首先想到的是类似的=来引用传递:

<body ng-app="myApp" ng-controller="myCtrl">
<test-directive action="action"></test-directive>
<script>
  angular.module("myApp",[])
      .controller("myCtrl",function($scope){
        $scope.action = {};
        $scope.action.init();
      })
      .directive("testDirective",function(){
        return {
          restrict:"E",
          scope: {
            action: "="
          },
          template:"<input type='text' ng-model='name' placeholder='白衣如花'>",
          controller: function ($scope) {
            $scope.action.init = function () {
              $scope.name = "白衣如花"
            }
          }
        }
      });
</script>
</body>

但是运行却发现,错误显示$scope.action.init is not a function,看提示应该是运行到第7行的时候,$scope.action.init函数还未定义。怎么办呢?把directive提到controller之前试试?一样是错误。

嗯,可以不用函数,直接在directive的controller中执行$scope.name = "白衣如花",似乎很完美,但如果是有参数的初始化呢?事实上js分离后,我遇到的问题是根据http请求的返回结果来初始化directive,由于

网络快慢不一定,导致控件初始化时不一定有http请求的返回(没有有效的初始化参数),也不能保证http请求返回后directive已经初始化(不能用=来进行函数调用)。 

需求很明了了,如果能监控参数变化,再执行初始化,此时能保证directive已经加载,而且有有效的参数。正好angularjs提供了$watch。代码如下:

<body ng-app="myApp" ng-controller="myCtrl">
<test-directive action="action"></test-directive>
<script>
  angular.module("myApp",[])
      .controller("myCtrl",function($scope){
        $scope.action = {name: "白衣如花"};
      })
      .directive("testDirective",function(){
        return {
          restrict:"E",
          scope: {
            action: "="
          },
          template:"<input type='text' ng-model='name' placeholder='白衣如花'>",
          link: function (scope, elem, attrs) {
            scope.$watch(attrs.action, function (value) {
              scope.action.init();
            })
          },
          controller: function ($scope) {
            $scope.action.init = function () {
              $scope.name = $scope.action.name
            }
          }
        }
      });
</script>
</body>

这是我对于directive数据交互的粗浅理解。想要更详细了解,请参看官方文档:https://docs.angularjs.org/guide/directive

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# angularjs  # 数据交互  # directive  # AngularJS实现分页显示数据库信息  # Angular.JS内置服务$http对数据库的增删改使用教程  # 三种AngularJS中获取数据源的方式  # AngularJS实现数据列表的增加、删除和上移下移等功能实例  # 基于AngularJS实现页面滚动到底自动加载数据的功能  # Angularjs实现多个页面共享数据的方式  # Angular.js如何从PHP读取后台数据  # Angularjs 滚动加载更多数据  # 深入学习AngularJS中数据的双向绑定机制  # 在 Angular6 中使用 HTTP 请求服务端数据的步骤详解  # Angular.JS读取数据库数据调用完整实例  # 如花  # 绑定  # 的是  # 很容易  # 变成了  # 几个  # 是有  # 多个  # 几天  # 我对  # 我这  # 也很  # 要注意  # 这是我  # 问题是  # 还未  # 可以实现  # 可以选择  # 不能用  # 这些都是 


相关文章: 官网建站费用明细查询_企业建站套餐价格及收费标准指南  如何零成本快速生成个人自助网站?  ,如何利用word制作宣传手册?  建站之星展会模板:智能建站与自助搭建高效解决方案  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  网站制作说明怎么写,简述网页设计的流程并说明原因?  如何挑选优质建站一级代理提升网站排名?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  制作电商网页,电商供应链怎么做?  外贸公司网站制作哪家好,maersk船公司官网?  c++ stringstream用法详解_c++字符串与数字转换利器  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  C#如何在一个XML文件中查找并替换文本内容  如何高效配置IIS服务器搭建网站?  香港服务器WordPress建站指南:SEO优化与高效部署策略  建设网站制作价格,怎样建立自己的公司网站?  建站之星2.7模板:企业网站建设与h5定制设计专题  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  如何通过免费商城建站系统源码自定义网站主题与功能?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何挑选高效建站主机与优质域名?  如何在IIS中新建站点并配置端口与物理路径?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  婚礼视频制作网站,学习*后期制作的网站有哪些?  ,怎么在广州志愿者网站注册?  如何配置WinSCP新建站点的密钥验证步骤?  网页设计网站制作软件,microsoft office哪个可以创建网页?  建站之星安装后如何配置SEO及设计样式?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  建站之星会员如何解锁更多建站功能?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  ,在苏州找工作,上哪个网站比较好?  Android滚轮选择时间控件使用详解  湖北网站制作公司有哪些,湖北清能集团官网?  建站主机选哪家性价比最高?  想学网站制作怎么学,建立一个网站要花费多少?  制作网站公司那家好,网络公司是做什么的?  如何在宝塔面板中修改默认建站目录?  测试制作网站有哪些,测试性取向的权威测试或者网站?  如何高效完成自助建站业务培训?  公司网站的制作公司,企业网站制作基本流程有哪些?  如何选择最佳自助建站系统?快速指南解析优劣  实例解析angularjs的filter过滤器  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何基于云服务器快速搭建网站及云盘系统?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。