• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >JavaScript > 彻底学会Angular.js中的transclusion

彻底学会Angular.js中的transclusion

作者:前端乱炖 字体:[增加 减小] 来源:互联网 时间:2017-05-11

前端乱炖通过本文主要向大家介绍了彻底学会Angular.js中的transclusion等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

前言

AngularJS中指令的重要性是不言而喻的,指令让我们可以创建自己的HTML标记,它将自定义元素变成了一个一个的模块,极大的体现了前端开发中的模块化模式,并提高了代码的易读性和重用性。AngularJS中的指令也是学习AngularJS中的一个难点所在,其中的许多属性,需要反复学习,认真体会,方能领悟其中的精妙之处。

今天我们要讲的就是其中一个重点和难点 – transclusion。关于这个话题我之前也写过很多文章来讲述,但是当时都是照搬博文中的例子,自己也没有比较深刻的体会,因此一直不得要领。今天我们的目标就是“彻底弄懂transclusion”。

一、什么是transclusion

好吧,我知道你肯定会去查词典,但是你会发现,词典上没有transclusion这个词的准确释义!!!纳尼!!!这不坑爹的吗!!!!

还好,维基百科上有一个注释,翻译过来意思大概是这样的:

transclusion在计算机科学中指的是讲一个文档或者一个文档的某部分在另一个文档中引用。
我去,这不坑爹的吗!!!什么意思!!!!

确实,你猜对了,这个解释对我们一点帮助都没有!!!!!!

还好,我们终于在某道词典找到了一个解释:“嵌入”,这里指的是transclusion这个词,而在后面我们即将看到的transclude这个词压根在词典上就找不到。算了,淡定一点,继续往下看。其实这里翻译为“嵌入”,如果从实际运用中来看,还是比较贴切的。如果你不太理解什么是transclusion,我们下面用一个例子来说明一下。

ok,现在我们要创建一个指令了,我们把这个指令叫做<handsome-me> 。在此先略过这个指令的创建过程,如果你还不知道怎样创建一个指令,请前参看前面几篇文章。

好了,无论怎么说,这个指令已经创建好了,于是我们可以有以下几种用法:

第一种:

<handsome-me/> 
</div>

就像是input一样对吧,很简单,我们叫它“自开自闭”(要是你在别的书上没看过这个名称,那就是我发明的,反正就这么叫)标签。

第二种:

<handsome-me></handsome-me> 
</div>

就像是div一样对吧,更简单,我们叫它“自开别人闭”(同上同上)标签。

第三种:

<handsome-me>
  //中间有好多代码
</handsome-me> 
</div>

这个和第二种很像吧,但是又有点区别,我们叫它“自开别人闭,中间加一坨”(总是感觉好粗俗。。。never mind。。。)标签。

我们来对比以下三种标签,它们有什么区别。当然区别很多。但是具体到我们今天的话题,与之相关的最大的区别就是前两种中间没有加一坨,第三种中间加了一坨。OK,因此我们现在来总结什么叫做transclusion:

如果你在定义指令的时候,想要它在具体使用时中间加一坨,那么你就要用transclusion。

这个定义实在是太经典了,完全比什么官方文档要清楚有没有,完爆各种老外唧唧歪歪说半天还是不明白有没有,完全符合中国国情有没有!!!

好了,知道了定义以后,我们要开始来看看具体怎么使用transclusion了。如果你了解AngularJS指令的编写,你一定知道return的那个对象的tranclude指令默认是false,因此如果你想要开启使用transclusion的话,就要将这个transclude属性赋上一个别的值,当然,这个值不能乱赋,它只有两种选择:

第一种选择:

transclude: true 
</div>

第二种选择:

transclude: 'element' 
</div>

我去,这个又是毛线啊!两者之间有毛的区别啊!!文档完全是看不懂的嘛!!!

淡定一点,现在我们来说区别。最常用的呢,是第一种,也就是赋值为true。还记得transclusion的中文意思吗,“嵌入”对吧!因此我们现在就不说“一坨”,而把中间的这一坨叫做“嵌入部分”。ok,回到正题,当transclude是true的时候,嵌入部分就是嵌入部分,比如说:

<handsome-me>
 {{name}}
<handsome-me> 
</div>

在transclude:true的时候,它的嵌入部分是什么啊?对了,就是{{name}} 。再来一发:

<handsome-me>
 <div>
 <span>{{name}}</span>
 </div>
<handsome-me>
</div>

在transclude:true的时候,它的嵌入部分是什么啊?对了,是

<div>
 <span>{{name}}</span>
</div> 
</div>

太简单了是吧!so easy!妈妈再也不用担心我的学习!!!

现在再来讲第二种情况,当transclude的值是element的时候,又是怎样一种情形。此时,嵌入部分变成了原来的嵌入部分加上外边的自定义标签,也就是整个元素。又听不懂了!!!fork fork fork!!!!!!淡定,我们再来举例子:

<handsome-me>
 {{name}}
<handsome-me> 
</div>

在transclude:'element'的时候它的嵌入部分是什么啊?对了,是:

<handsome-me>
 {{name}}
<handsome-me> 
</div>

再来一发:

<handsome-me>
 <div>
 <span>{{name}}</span>
 </div>
<handsome-me>
</div>

在transclude:'element'的时候它的嵌入部分是什么啊?对了,是:

<handsome-me>
 <div>
 <span>{{name}}</span>
 </div>
<handsome-me>
</div>

都说的这么详细了,不要再说你不会了哈!!!

二、ng-transclude的作用是什么

在编写指令时,我们都会有一个template或者templateUrl这样的属性是吧。在使用transclusion时,我们要把嵌入部分放到模板中,因此我们有两种选择,其中一种选择就是使用ng-transclude。

ng-transclude是干什么用的,我们还是先来看定义,再来看例子:

ng-tranclude决定了在什么地方放置嵌入部分。

太好理解了!于是我们来看例子:

假设指令是这样的:

<handsome-me>
 {{name}}
</handsome-me>
</div>

而模板是这样的:

<div>
 <p>MaMa does not need to worry about my study anymore! </p>
 <div ng-transclude></div>
</div> 
</div>

于是,在transclude:true的情况下,最终呈现在页面中的HTML会是什么样子。对了,是这样:

<div>
 <p>MaMa does not need to worry about my study anymore! </p>
 {{name}} 
</div> 
</div>

另一种情况,在transclude:'element'的情况下,最终呈现在页面中的HTML会是什么样子。对了,是这样:

<div>
 <p>MaMa does not need to worry about my study anymore! </p>
 <handsome-me>
  {{name}}
 </handsome-me>
</div> 
</div>

例子这么清楚,总能明白了吧!!

三、不使用ng-transclude的情形

OK,现在我们来想一个问题,如果我想把我的嵌入部分多次放入我的模板中怎么办?你可能会说,那就多放几个ng-transclude呗!这当然是不行的,在AngularJS中你只在一个指令的模板中只能申明一个ng-tranclude。所以这种情况下我们就能使用模板了,因此我们要使用一个叫做tranclude()的函数!!

纳尼!这又是什么东西!!!如果你仔细去研究一下AngularJS的文档的话,你一定会发现一个叫做$tranclude的service,它就是我们现在要将讲的东西。那么这个函数怎么用?如果你看过一些关于ng-repeat,ng-swift源码的解析,你一定会记得其中的一个叫做linker的东西。这个东西上是什么曾经困扰过我好长时间,但是后来我发现这个linker()其实就是transclude() 。

我们在link,compile以及controller中都能找到这个transclude函数的身影。在link函数中,transclude是link函数的第五个参数;在compile函数

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-11Vue.js基础知识小结
  • 2017-05-11Bootstrap 手风琴菜单的实现代码
  • 2017-05-11浅谈Vue.js
  • 2017-05-11重新理解JavaScript的六种继承方式
  • 2017-05-11el表达式 写入bootstrap表格数据页面的实例代码
  • 2017-05-11jQuery基本筛选选择器实例代码
  • 2017-05-11浅谈javascript中的 “ && ” 和 “ || ”
  • 2017-05-11BootStrap Datetimepicker 汉化的实现代码
  • 2017-05-11JS正则验证多个邮箱完整实例【邮箱用分号隔开】
  • 2017-05-11Vue数据驱动模拟实现5

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • jQuery实现验证码功能
    • 基于vue2.0+vuex的日期选择组件功能实现
    • jQuery实现的浮动层div浏览器居中显示效果
    • 微信小程序 css使用技巧总结
    • jQuery使用JSONP实现跨域获取数据的三种方法详解
    • JavaScript实现定时页面跳转功能示例
    • jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
    • bootstrap配合Masonry插件实现瀑布式布局
    • JAVA中截取字符串substring用法详解
    • jQuery实现的简单排序功能示例【冒泡排序】

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有