angularjs中展示富文本编辑器文本,向DOM中插入元素
前几天在用textangular富文本编辑器插件时,将存储的文本及格式存储到数据库中,但是从后台接口中再向angular页面插入时却不能执行,即在Angular中操作DOM没有实现,后来查看了一下,操作DOM需要使用指令Directive封装DOM,这样尝试之后终于解决了问题,从而对指令也有了很大的了解,以后再操作DOm就要小心了
以下是我查阅资料时看到的,感觉so详细,解决了我很多issue,因此copy过来看看
原文http://www.cnblogs.com/xuema/p/4350747.html
创建指令
指令也是一种服务,只是这种服务的定义有几个特殊要求:
- 必须使用模块的directive()方法注册服务
- 必须以对象工厂/factory()方法定义服务实现
- 对象工厂必须返回一个指令定义对象
- //定义指令的类工厂
- var directiveFactory = function(injectables){
- //指令定义对象
- var directiveDefinationObject = {
- ...
- };
- return directiveDefinationObject;
- };
- //在模块上注册指令
- angular.module("someModule",[])
- .directive("directiveName",directiveFactory);
INSIDE:指令在注入器中的登记名称是:指令名+Directive。 例如,ng-app指令的服务名称是:"ngAppDirective"。
示例(http://www.dwz.cn/26R4S5中“使用指令封装DOM操作”第一页)定义一个简单的指令ez-hoverable,这个指令被限制只能 出现在属性的位置,每个具有这个指令的HTML元素,将在鼠标移入 时以虚线边框突出显示。
指令定义对象
每个指令定义的工厂函数,需要返回一个指令定义对象。指令定义对象就是 一个具有约定属性的JavaScript对象,编译器/$compile在编译时就根据这 个定义对象对指令进行展开。
指令定义对象的常用属性如下:
- template : string
使用template指定的HTML标记替换指令内容(或指令自身)
- restrict : string
用来限定指令在HTML模板中出现的位置。
- replace : true|false
使用这个属性指明template的替换方式。
- scope : true|false|{...}
scope属性为指令创建私有的作用域,这在创建可复用的Widget时非常有用。
- link : function(..){...}
link属性是一个函数,用来在指令中操作DOM树、实现数据绑定。
- transclude : true|false|'element'
允许指令包含其他HTML元素,这通常用于实现一个容器类型的Widget。
template:定义替换模板
最简单的指令只需要使用template属性进行模板替换就可以实现。
template指明一个HTML片段,可以用来:
- 替换指令的内容。这是默认的行为,可以使用replace属性更改。
- 如果replace = true,那么用HTML片段替换指令本身。
- 包裹指令的内容,如果transclue属性为true。
示例(http://www.dwz.cn/26R4S5中“使用指令封装DOM操作”第三页)实现了一个ezCustomer指令,这个指令只是简单的使用template指定的 模板替换ez-customer的内容:
restrict:限制指令的出现位置
restict属性可以是EACM这四个字母的任意组合,用来限定指令的应用场景。 如果不指定这个属性,默认情况下,指令将仅允许被用作元素名和属性名:
- E - 指令可以作为HTML元素使用
- A - 指令可以作为HTML属性使用
- C - 指令可以作为CSS类使用
- M - 指令可以在HTML注释中使用
我们对之前的示例,增加一个restrict属性,限制这个只能作为元素名使用。 代码已经预置到右边,你可以看到,现在唯一合法的方式是使用如下方式应用指令:
- <ez-customer></ez-customer>
考查编译后的DOM结构,你会发现ez-customer这个”伪“HTML标签还被保留着,这有时让完美 主义者有点闹心:
replace:模板的使用方式
我们希望使用template完整地替换原始的DOM对象,而不是填充其内容,replace 属性负责这件事。
replace属性指明使用template时,如何替换指令元素:
- true - 编译时,将使用template替换指令元素
- false - 编译时,将使用template替换指令元素的内容
示例(http://www.dwz.cn/26R4S5中“使用指令封装DOM操作”第五页)增加了replace属性,值为true意味着这个指令要求编译器使用template 替换原始的DOM元素:
你可能注意到模板的内容稍微修改了一下,这是因为replace为true时,要求模板有 一个根节点。
作用域问题
默认情况下,指令没有自己的scope对象,换句话说,它使用所在DOM对象对应的scope对象。
那么问题来了,如果一个指令在同一个scope内出现多次,会怎样?
- <div ng-controller="ezCtrl">
- <ez-customer></ez-customer>
- <ez-customer></ez-customer>
- </div>
没错,由于两个ez-customer指令都处在ezCtrl开辟的作用域内,所以两个指令绑定到了同样的 数据模型上,得到的是重复的结果。
显然,我们可以将每个ez-customer指令置于不同的作用域下,这意味着我们给每个ez-customer 一个不同的控制器:
- <div ng-controller="ezCtrl1">
- <ez-customer></ez-customer>
- </div>
- <div ng-controller="ezCtrl2">
- <ez-customer></ez-customer>
- </div>
看起来很怪异,对吗?
scope:使用隔离的作用域
通过设置scope属性,指令的每个实例都将获得一个隔离的本地作用域:
- var ezCustomerDirectiveFactory = function(){
- return {
- restrict:"E",
- replace:true,
- scope:{
- name : "@name",
- address : "=address"
- },
- template:"<div>name:{{name}} address:{{address}}</div>"
- }
- }
在上面的例子中,我们在本地scope上定义了两个属性:name和address,这样在 模板中就可以使用name和address了。
你应该已经注意到,name属性的值之前有一个@符号,这是一个约定好的标记,它 告诉编译器,本地scope上的name值需要从应用这个指令的DOM元素的name属性值 读取,如果DOM元素的name属性值变了,那么本地scope上的name值也会变化。
同样,address属性之前的=符号也是一个约定好的标记,它告诉编译器,本地scope 上的address属性值和DOM元素的address属性值指定的外部scope对象上的模型需要 建立双向连接:外部scope上模型的变化会改变本地scope上的address属性,本地 scope上address属性的变化也会改变外部scope上模型的变化。
有点绕,上个图:
从图中可以看出:
- 指令的template绑定的是本地scope上的name和address。
- 本地scope的name属性的值始终是ez-customer对象上name属性的值
- 本地scope的address属性值始终和ez-customer对应的scope对象上的Emmy.address 保持同步。
link:在指令中操作DOM
如果需要在指令中操作DOM,我们需要在对象中定义link属性,link函数的定义如下:
- function link(scope, iElement, iAttrs, controller, transcludeFn) { ... }
注意link函数的参数,AngularJS在编译时负责传入正确的值:
- scope
指令对应的scope对象。如果指令没有定义自己的本地作用域,那么传入的就是外部的 作用域对象。
- iElement
指令所在DOM对象的jqLite封装。如果使用了template属性,那么iElement对应 变换后的DOM对象的jqLite封装。
- iAttrs
指令所在DOM对象的属性集。这是一个Hash对象,每个键是驼峰规范化后 的属性名。
后两个参数我们先略过。
示例
示例(http://www.dwz.cn/26R4S5中“使用指令封装DOM操作”第八页)中,我们实现了一个可以指定显示格式的小时钟指令:ezCurrentTime。和原来一样, 我们在link函数中启动定时器,并在定时器中更新DOM。有几点解释下:
- 我们在scope上使用$watch()方法对format的值进行监听,并使用这个值调整显示格式
- 我们监听element的$destroy事件,这个事件是在DOM对象销毁时触发。我们在这个事件触发时 销毁定时器以释放资源
- 我们使用了AngularJS内置的$interval服务,而不是setInterval()函数创建定时器。
- 我们使用了AngularJS内置的dateFilter过滤器服务,对时间的显示进行格式化。 和$interval一样,dateFilter服务也是通过注入器注入的。
transclude:包含其他元素
有些指令需要能够包含其他未知的元素。比如我们定义一个指令ez-dialog,用来 封装对话框的样式和行为,它应当允许在使用期(也就是在界面模板文件里)才指 定其内容:
- <ez-dialog>
- <p>对话框的内容在我们开发ez-dialog指令的时候是无法预计的。这部分内容需要
- 被转移到展开的DOM树中适当的位置。</p>
- </ez-dialog>
transclude属性可以告诉编译器,利用所在DOM元素的内容,替换template中包含 ng-transclude指令的元素的内容:
从上图中可以看到,使用transclude有两个要点:
- 需要首先声明transclude属性值为true,这将告诉编译器,使用我们这个指令的 DOM元素,其内容需要被复制并插入到编译后的DOM树的某个点。
- 需要在template属性值中使用ng-transclude指明插入点。
右边嵌入了ez-dialog的实现实例(http://www.dwz.cn/26R4S5中“使用指令封装DOM操作”第九页)。
angularjs中展示富文本编辑器文本,向DOM中插入元素的更多相关文章
- HTML中常见的各种位置距离以及dom中的坐标讨论
最近在学习JavaScript,特意买了一本犀牛角书来看看,尼玛一千多页,看的我头昏脑涨,翻到DOM这章节,突然记起平常在使用DOM时,碰到了好多的这个dom里面的各种宽度,高度,特意在此写一写,写的 ...
- 富文本编辑器直接从 word 中复制粘贴公式
在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案,在这里感谢一下知乎中众大神以及TheViper. 通过知乎提供的思路找到粘贴的原理,通过TheViper找 ...
- 百度富文本编辑器ueditor在jsp中的使用(ssm框架中的应用)
折腾了一下午终于把百度富文本编辑器ueditor搞定了! 项目地址:https://github.com/724888/lightnote_new 首先我参考了一个ueditor的demo ...
- KindEditor富文本编辑器, 从客户端中检测到有潜在危险的 Request.Form 值
在用富文本编辑器时经常会遇到的问题是asp.net报的”检测到有潜在危险的 Request.Form 值“一般的解法是在aspx页面 page 标签中加上 validaterequest='fa ...
- 让富文本编辑器支持复制doc中多张图片直接粘贴上传
Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧? 我希望打开文档doc直接复制粘贴到富文本编辑器,直接发布 感觉这个似乎很困难 ...
- 富文本编辑器实现从word中复制图片(外挂)
1问题 基于web的富文本编辑器的功能普遍较弱,而word是公认的宇宙第一好用的文档编辑器,所以许多人都习惯先在word中编辑,然后再将内容粘到web富文本编辑器中. 但是,这种操作有一个问题:图片带 ...
- .net下将富文本编辑器文本原样读入word文档
关键词:富文本编辑器 生成word 样式 为了解决标题中提出的问题,首选需要了解,在.net环境下读取数据库中的内容动态生成word至少有2种方式,[方式一]一种方式是在项目中添加引用,例如在“添 ...
- mac 文本编辑器 文本编码Unicode utf-8 不适用的问题
在mac上使用默认的文本编辑器打开下载的xx.txt文件,如果文本是gbk的编码可能会出现 文本编码Unicode utf-8 不适用的打开错误,如下图 解决方式: 文本编辑---偏好设置-----打 ...
- 获取特定html源码 富文本编辑器 爬虫生成 dom
python beautifulsoup获取特定html源码 - 吴悟无 - 博客园 https://www.cnblogs.com/vickey-wu/p/6843411.html PyQuery库 ...
随机推荐
- android 内存处理工具
1. LeakCanary 检查内存泄露 LeakCanary 是一个开源的在debug版本中检测内存泄漏的java库. 让我们来看看一个cait的例子: 1 2 3 4 5 6 7 8 9 10 1 ...
- 图论$\cdot$最短路问题
Dijkstra单源最短路径算法 Dijkstra可以计算出发点到每个点的最短路,及单源最短路径(SSSP).这一特点使得Dijkstra常常用来进行其他算法的预处理.用Dijkstra算法计算最短路 ...
- Burning Bridges-ZOJ1588(割边求解)
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little country ...
- JAVA线程同步辅助类CountDownLatch
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在当前计数到达 ...
- Jquery 复习练习(01)
Jquery 复习练习 window.onload = function() {} == $(function() {}); 千万注意:js对象和jq对象的区别,这也是常常犯的错误 js对象举例: w ...
- python virtualenv
一 安装 pip install virtualenvwrapper - 把下面这句加到~/.bash_profile里面,如不嫌麻烦,也可以每次都手动执行.source /usr/local/bi ...
- [问题2014A11] 复旦高等代数 I(14级)每周一题(第十三教学周)
[问题2014A11] 设 \(n\) 阶方阵 \(A,B\) 满足: \((A+B)^2=A+B\), \(\mathrm{r}(A+B)=\mathrm{r}(A)+\mathrm{r}(B)\ ...
- URL地址传参乱码
1.页面使用javascript的方法encodeURIComponent对需要转码的字符进行两次转码,如:encodeURIComponent(encodeURIComponent("** ...
- FreeSWITCH中文语音包
一.中文语音资源的获取 官方提供的资源:http://files.freeswitch.org/releases/sounds/ 自己录音 实在不行可以@我给你发一份. 二.中文资源的安装 英文资源的 ...
- 初识onselectstart
onselectstart几乎可以用于所有对象,其触发时间为目标对象被开始选中时(即选中动作刚开始,尚未实质性被选中). 实例: 在做拖拽效果的时候,为了防止js选中页面上的其他元素,onselect ...