angular指令的transclude学习

RabbitMQ信使
• 阅读 2623

最近学习angular,今天将指令中的transclude选项和ng-transclude指令总结一下。本文演示用的angular版本为1.5.11
首先,angualar指令的transclude选项有三种值:falsetrueobjecttransclude字面意思就是嵌入,也就是说你需不需要将你的指令中的内容(注意不是指令的模板)嵌入到你的模板中去,默认是false。如果你需要这种功能的话,那么就需要将transclude设置为true或者{...}。如果将这个值设置为true或者{...}的话,那么就要配合angularng-transclude指令来进行使用。下面我们通过代码来学习如何使用。

  • 页面内容

<body ng-app="transcludeApp">

  <div ng-controller="trascludeCtrl">
    <my-dialog>
      my dialog contents, {{ name }}
    </my-dialog>
  </div>

  <script src="angular.js"></script>
  <script src="transclude.js"></script>
</body>

我们在页面中使用了自定义指令my-dialog,并且在该指令中添加了一段文本内容(指令中的内容)。

  • transclude.js文件内容

angular.module('transcludeApp', [])
  .controller('trascludeCtrl', ['$scope', function($scope) {
    $scope.name = 'Tobias';
  }])
  .directive('myDialog', function() {
    return {
      restrict: 'E',
      transclude: true,
      scope: {},
      templateUrl: 'my-dialog.html',
      link: function(scope) {
        scope.name = 'Jeff';
      }
    };
  });
  • my-dialog.html模板文件中的内容

<div class="alert">
  directive template, {{ name }}
  <hr>
  <div ng-transclude>ng-transclude,{{ name }}</div>
</div>

我们查看一下运行结果:

angular指令的transclude学习

可以看到指令中的内容填充到了指令模板中ng-transclude指令所在的元素中,ng-transclude指令所在元素的内容会被指令内容替代,并且此时指令内容受指令外部的作用域控制;但是当指令中没有任何内容时(空格也不允许),ng-trasclude指令所在元素的内容会显示出来,此时ng-trasclude指令所在元素的内容受指令外部的作用域控制。下面看一下改动代码:

  • 页面更改为

<body ng-app="transcludeApp">

  <div ng-controller="trascludeCtrl">
    <my-dialog></my-dialog>
  </div>

  <script src="angular.js"></script>
  <script src="transclude.js"></script>
</body>
  • 结果变为

angular指令的transclude学习

接下来,我们来看一下有多个嵌入点的情况,这时指令中的transclude选项是一个对象。请看代码:

  • 页面内容

<body ng-app="transcludeApp">

  <div ng-controller="trascludeCtrl">
    <my-dialog>
      my dialog content, {{ name }}
      <transclude-header>transclude header content, {{ name }}</transclude-header>
      <transclude-body>transclude body content, {{ name }}</transclude-body>
      <!-- <transclude-footer>transclude footer content, {{ name }}</transclude-footer> -->
      my dialog content footer, {{ name }}
    </my-dialog>
  </div>

  <script src="angular.js"></script>
  <script src="transclude.js"></script>
</body>
  • transclude.js文件内容

angular.module('transcludeApp', [])
  .controller('trascludeCtrl', ['$scope', function($scope) {
    $scope.name = 'Tobias';
  }])
  .directive('myDialog', function() {
    return {
      restrict: 'E',
      transclude: {
        'header': 'transcludeHeader',
        'body': 'transcludeBody',
        'footer': '?transcludeFooter',
      },
      scope: {},
      templateUrl: 'my-dialog.html',
      link: function(scope) {
        scope.name = 'Jeff';
      }
    };
  });
  • my-dialog.html模板文件内容

<div class="alert">
  directive template, {{ name }}
  <hr>
  <div ng-transclude>ng-transclude,{{ name }}</div>
  <hr>
  <div ng-transclude="header">ng-transclude-header,{{ name }}</div>
  <div ng-transclude="body">ng-transclude-body,{{ name }}</div>
  <div ng-transclude="footer">ng-transclude-footer,{{ name }}</div>
</div>
  • 运行结果

angular指令的transclude学习

我们的transclude对象定义了如何将多个嵌入点与指令内部的指令嵌入点一一对应,拿'footer': '?transcludeFooter'来解释一下,footer对应指令模板中的一个嵌入点,transcludeFooter对应指令元素内部的那个transclude-footer指令,前面的?表示这个嵌入点不一定有对应的指令存在。根据运行结果,我做出以下推论:首先指令模板替换(嵌入?)页面中指令所在的元素;然后如果指令的transclude选项不为false,则从指令内容中选择指定元素嵌入(替换?)到指令模板中的指定位置,而transclude对象就是确定对应关系的桥梁;最后如果指令中没有对应关系的其它内容都会对应到ng-transclude

参考文章:angular指令的transclude选项以及ng-transclude指令

点赞
收藏
评论区
推荐文章
虾米大王 虾米大王
3年前
Java代码002
code002.jspInserttitlehere<!我们来说说,页面的page指令@pageattr1"value1"attr2"value2"....1.language属性用于设置JSP页面使用的语言,目前只支持java如@pagelanguage"java"2.extends属性该
_dolphin _dolphin
4年前
Linux指令学习
一、Linux指令目录1.进入root权限rooti2.删除一个文件夹rmdirdirnamedirname:文件夹的目录名字3.删除一个文件rmifilenamefilename:文件名字4.给文件权限sudochmodux filenamefilename:文件名字5.出现“权限不够”和“坏的解释器\ 没有
Wesley13 Wesley13
4年前
3、Angular JS 学习笔记 – Controllers [翻译中]
理解控制器在Angular中,一个控制器是一个javascript构造函数用于填充Angular作用域。当一个控制器通过使用ngcontroller指令附加到DOM上的时候,Angular将初始化一个新的Controller对象,使用指定的控制器构造函数。一个新的子作用域将可以作为一个参数$scope被注入到控制器构造函数。控制器用
Stella981 Stella981
4年前
Linux中iptables的正确使用
1.首先介绍一下指令和相关配置文件启动指令:service iptables start重启指令:service iptables restart关闭指令:service iptables stop然后是相关配置:/etc/sysconfig/iptables如何操作该配置呢?vim /etc/sysconfig/iptab
Wesley13 Wesley13
4年前
PIC中档单片机汇编指令详解(5)
位操作指令详述BCF数据寄存器指定位清0语法形式:BCFf,b操作数:f为数据寄存器的低7位地址(0x00~0x7F)B为数据位编号(0~7)执行时间:一个指令周期执行过程:使数据寄存器f的的b位清0状态标志影响:无说明:该指令可对任何数据寄存器的任意一个位置清0,常用于标志位的设定和清除,或者把某一管脚置成低电平。指
Stella981 Stella981
4年前
Sass @media指令
本节我们学习Sass中的@media指令,@media指令用于设置样式规则到不同的媒体类型,这和CSS的使用规则差不多,但是它还有一点不同,就是@media指令可以嵌套在Sass选择器中。有点类似于JS冒泡功能,它会冒泡到样式表的顶层。@media指令的使用示例:.xkd{
Stella981 Stella981
4年前
AngularJS 指令实践
指令(Directives)是所有AngularJS应用最重要的部分。尽管AngularJS已经提供了非常丰富的指令,但还是经常需要创建应用特定的指令。这篇教程会为你讲述如何自定义指令,以及介绍如何在实际项目中使用。在这篇文章的最后,我会指导你如何使用Angular指令来创建一个简单的记事本应用。概述一个指令用来引入新的HTML语法。指令是DO
Wesley13 Wesley13
4年前
2.初步认识Angular2
简述:一个完整的Angular应用主要由六个重要部分构成,分别是:组件,模板,指令,服务,依赖注入,和路由.这些组成部分各司其职,而又紧密协作.其中,与用户直接打交互的是模板视图,它是构成组件的要素之一.另一要素是组件类,用以维护组件的数据模型及功能逻辑.路由的功能是控制组件的创建和销毁,从而驱使应用界面跳转切换/指令与模板相互关联,最重要
Wesley13 Wesley13
4年前
UI 真正的含义是什么?
用户界面(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.51code.com%2F)(Userinterface),是一个比较广泛的概念,指人和机器互动过程中的界面,以手机为例,手机上的界面都属于用户界面。我们通过这个界面向手机发出指令,手机根据指令产生相应的反馈。设计这套界
Stella981 Stella981
4年前
Angular内置指令
Angular2的内置指令可分为通用指令、路由指令、表单指令。通用指令包含7种,均包含在CommonModule模块中,CommonModule已经包含在了BrowserModule中。NgClassNgstyleNgIfNgForNgSwitch、NgSwitchCase、NgSwitchDe
Stella981 Stella981
4年前
Angular @HostBinding()和@HostListener()用法
@HostBinding()和@HostListener()在自定义指令时非常有用。@HostBinding()可以为指令的宿主元素添加类、样式、属性等,而@HostListener()可以监听宿主元素上的事件。@HostBinding()和@HostListener()不仅仅用在自定义指令,只是在自定义指令中用的较多本文基于Angular2