angular学习笔记(三十)-指令(4)-transclude

简介:
 from: http://www.cnblogs.com/liulangmao/p/3951865.html

本篇主要介绍指令的transclude属性:

transclude的值有三个:

1.transclude:false(默认值)

不启用transclude功能.

 

2.transclude:true

启用transclude,启用以后,有两个地方会发生变化:

①.使用指令的元素内部的所有内容都会被保存起来.不妨先把这一段内容称为一坨.

比如指令元素是这样的: <cd-hello><h3>code_bunny</h3></cd-hello>,那么,这一坨就是<h3>code_bunny</h3>

②.在指令的模板中,元素可以添加ng-transclude属性,添加了这个属性的元素,会被刚才的那一坨内容所填充.

比如模板是这样的: 

<div>
    <h2>hello</h2>
    <div ng-transclude></div>
</div>

使用后会变成:

<div>
    <h2>hello</h2>
    <div ng-transclude><h3>code_bunny</h3></div>
</div>    

需要注意的一点是,这一坨内容,应该是有标签的,如果是纯文本,没有标签,那么,它被放入ng-transclude元素以后,会自动添加span标签来包含文本内容:

比如指令元素是这样的: <cd-hello>code_bunny</cd-hello>

模板是这样的:

    <div>
      <h2>hello</h2>
      <div ng-transclude></div>
    </div>

那么使用后会变成:

<div>
    <h2>hello</h2>
    <div ng-transclude><span>code_bunny</span></div>
</div>  

下面举个栗子:

html:

复制代码
复制代码
<!DOCTYPE html>
<html ng-app="dirAppModule">
<head>
  <title>20.5指令</title>
  <meta charset="utf-8">
  <script src="../angular.js"></script>
  <script type="text/ng-template" id="text.html">
    <div>
      <h3>{{title}}</h3>
      <div ng-transclude></div>
    </div>
  </script>
  <script src="script.js"></script>
  <style type="text/css">
    *{
      font-family:'MICROSOFT YAHEI';
      font-size:12px
    }
    h3 {
      color:#CB2027
    }
  </style>
</head>
<body>
  <input ng-model="title"/>
  <br/>
  <textarea cols="30" rows="4" ng-model="text"></textarea>
  <div cd-text>{{text}}</div>
</body>
</html>
复制代码
复制代码

js:

复制代码
复制代码
/*20.5 指令 */
var appModule = angular.module('dirAppModule', []);
appModule.directive('cdText',function(){
    return {
        restrict:'EAC',
        templateUrl:'text.html',
        replace:true,
        transclude:true
    }
});
复制代码
复制代码

最后得到的结果:

可以看到,{{text}}被放在了有ng-transclude指令的div里,并且由于{{text}}没有被任何标签包含,它自动添加了span标签来包含它.

 

3.transclude:'element'

当transclude的值为'element'时(注意element就是element这个单词,而不是自己写元素名),基本上和ture用法是一致的,唯一的区别是,为true的情况下,那一坨是指令元素内部的内容,而为'element'时,那一坨是整个指令元素:

比如指令元素是这样的: <cd-hello><h3>code_bunny</h3></cd-hello>,那么,这一坨就是<cd-hello><h3>code_bunny</h3></cd-hello>

值得注意的是,虽然cd-hello这个元素本身就是个指令元素,它会被模板内容填充(或替换),但是,当它作为ng-transclude的一坨被插入到ng-transclude的元素里,是不会再应用cd-hello指令,无限次被替换下去进入死循环的...

还是2的栗子,我们把transclude属性值改为'element'以后可以看到,所有的效果都是不变的,唯独ng-transclude指令元素里的一坨变为整个cd-text元素:

 

4. transclude()函数

在一个模板里,ng-transclude指令只能被使用一次.所以,如果需要重复使用那一坨,需要使用transclude()函数,这个函数分别可以出现在以下三个地方:

1.控制器里,通过依赖注入 $transclude

2.link属性的函数的第五个参数.只要顺序是在第五个,名字取什么不重要,一般就取transclude

3.compile属性的函数的第三个参数.只要顺序是在第三个,名字取什么不重要,一般就取transclude

transclude()的用法是进阶话题,需要理解angular的编译,链接,指令的作用域.并且,只有ng-repeat这类指令才会用到.故这里先放一放,日后再深入研究.

参考文档:http://www.html-js.com/article/1869

完整代码:https://github.com/OOP-Code-Bunny/angular/blob/master/OREILLY/20.5%20%E6%8C%87%E4%BB%A4.html

     https://github.com/OOP-Code-Bunny/angular/blob/master/OREILLY/script.js















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/7169040.html,如需转载请自行联系原作者

相关文章
|
7月前
|
存储 缓存 JavaScript
Angular Universal 学习笔记
Angular Universal 学习笔记
72 0
|
7月前
|
前端开发 JavaScript API
Angular Change Detection 的学习笔记
Angular Change Detection 的学习笔记
38 0
|
存储 缓存 JavaScript
Angular Universal 学习笔记
Angular Universal 学习笔记
118 0
Angular Universal 学习笔记
|
前端开发 JavaScript
对于Angular表达式以及重要指令的研究心得【前端实战Angular框架】
对于Angular表达式以及重要指令的研究心得【前端实战Angular框架】
对于Angular表达式以及重要指令的研究心得【前端实战Angular框架】
|
JavaScript 数据安全/隐私保护 索引
Angular最新教程-第十四节 指令 结构型指令 属性型指令 自定义指令
Angular最新教程-第十四节 指令 结构型指令 属性型指令 自定义指令
156 0
Angular最新教程-第十四节 指令 结构型指令 属性型指令 自定义指令
|
UED
Angular 2.x折腾记 :(9) 初步了解指令,及动手一步一步写个自定义指令
指令这种东西,可以加强用户体验,减少一些重复工作; 跟着我来实现一个悬浮链接打开的指令
98 0
|
JavaScript
Angular Form (响应式Form) 学习笔记
Angular Form (响应式Form) 学习笔记
153 0
Angular Form (响应式Form) 学习笔记
|
JSON API 数据格式
Angular CLI builder 学习笔记
Angular CLI builder 学习笔记
103 0
Angular CLI builder 学习笔记
Angular 自定义结构化指令,如何传入多个输入参数
Angular 自定义结构化指令,如何传入多个输入参数
176 0
Angular 自定义结构化指令,如何传入多个输入参数

热门文章

最新文章