AngularJs定制样式插入到ueditor中的问题小结


Posted in Javascript onAugust 01, 2016

总结一下自己给编辑器定制样式的过程中所遇到的问题,主要是编辑器的二次开发接口,以及用angular定制样式,问题不少,终于在**的帮助下,完成了,还剩下老版本和新版本的交互没有弄好,不过不难。下面分别讲解问题。

ueditor的开发

你可以在官网上下载任意版本,进行使用即可:http://ueditor.baidu.com/website/download.html 下载后按照官网上的配置就可以使用。文档地址:http://fex.baidu.com/ueditor/ 关于ueditor二次开发问题还真不少,这里列出来。

1.ueditor自动将div标签过滤变为p标签

在定制样式过程中,发现div全部被过滤未p标签,网上找了好些资料,但都没用,后来看到有大神写到,不同版本的ueditor配置不一样,这里写下我的解决办法是:打开ueditor.config.js配置文件,添加下面的代码:

, allowDivTransToP: false

注意是在window.UEDIROE_CONFIG里面手动添加!另外也有人遇到类似的情况解决办法,这里可以参考:http://www.cnblogs.com/Olive116/p/3464495.html

2.如何把定制的样式插入到编辑器里面呢?

在编辑器里面提供了接口,我们来看看。

function insertHtml() {
var value = prompt('插入html代码', '');
UE.getEditor('editor').execCommand('insertHtml', value)
}

那么如何在我们自己的项目中使用该接口呢?首先要实列化编辑器,通常是直接使用UE.getEditor()来得到实例。

//使用工厂方法getEditor创建和引用编辑器实例,如果在某个闭包下引用该编辑器,直接调用UE.getEditor('editor')就能拿到相关的实例使用之前我们需要先把该编辑器引入进来,才能调用其方法。

<script src="libs/ueditor/ueditor.config.js"></script>
<script src="libs/ueditor/ueditor.all.min.js"></script>

在我们的angular的项目中创建编辑器实例如下,编辑器提供ready的方法来实例化:

// 创建编辑器的实列
$scope.ready = function (ueditor) {
window.editor = ueditor;
};

OK,我们现在就可以使用editor这个编辑器实例了。接下来看看ng定制的样式。

ng定制的样式

先来看下,我们用手写的手风琴菜单样式。下载地址:https://github.com/foreverjiangting/set-menu/tree/master/menu 这里使用的交互使用了data-toggle="collapse",但和ng有冲突,所以需要用ng来控制交互。我们来看看怎么写:

<!-- 添加工具栏 -->
<div class="set-toolbar">
<h4 class="text-center">工具栏</h4>
<!-- sidebar content -->
<div class="sidebar-menu">
<a ng-click="toggle('titleStyle')" class="nav-header menu-first " ><span class="glyphicon glyphicon-pencil"></span>首页</a>
<ul ng-hide="titleStyle" id="userMeun" class="nav nav-list menu-second">
<li ng-repeat="title in sources.titles" ng-click="insertHtml('titles', title)"><a>{{title.name}}</a></li>
</ul>
<a ng-click="toggle('titleIcon')" class="nav-header menu-first"><span class="glyphicon glyphicon-picture"></span>图标</a>
<ul ng-hide="titleIcon" id="articleMenu" class="nav nav-list menu-second">
<li class="set-image" ng-repeat="img in sources.imgs" ng-click="insertHtml('imgs', img)"><a><img ng-src="{{img.url}}"></a></li>
</ul>
<a ng-click="toggle('titleYouxia')" class="nav-header menu-first "><span class="glyphicon glyphicon-user">生活</span></a>
<ul ng-hide="titleYouxia" id="glyphicnMenu" class="nav nav-list menu-second">
<li ng-repeat="yx in sources.yxs" ng-click="insertHtml('yxs', yx)"><a>{{yx.name}}</a></li>
</ul>
<a ng-click="toggle('titleServe')" class="nav-header menu-first "><span class="glyphicon glyphicon-briefcase"></span>留言板</a>
<ul ng-hide="titleServe" id="serveMenu" class="nav nav-list menu-second">
<li ng-repeat="ser in sources.sers" ng-click="insertHtml('sers', ser)"><a>{{ser.name}}</a></li>
</ul>
<a ng-click="toggle('titleArticle')" class="nav-header menu-first "><span class="glyphicon glyphicon-thumbs-up"></span>推荐文章</a>
<ul ng-hide="titleArticle" id="ArticleMenu" class="nav nav-list menu-second">
<li ng-repeat="arc in sources.arcs" ng-click="insertHtml('arcs', arc)"><a>{{arc.article}}</a></li>
</ul>
</div>
<!-- 内容主题结束 -->
</div>

js里面的代码如下:

// 工具栏交互样式
$scope.titleStyle = $scope.titleIcon = $scope.titleYouxia = $scope.titleServe = $titleArticle=false;
$scope.toggle = function(style){
$scope[style] =! $scope[style];
}

ng控制的手风琴效果,简单轻便,代码量少。

效果如下:

AngularJs定制样式插入到ueditor中的问题小结

样式写好以后就是插入到编辑器中,那么如何插入呢?这里有两种,直接插,和根据搜索之后的文章进行插入。直接插入的话比较简单。

$scope.insertHtml = function (type, item) {
if (type === 'titles' || type === 'imgs') {
editor.execCommand('insertHtml', item.html);
}

插入之后的效果如下:

AngularJs定制样式插入到ueditor中的问题小结

当然我们这样做有什么用呢?主要是利用编辑器里面的内容,利用ng数据绑定,反映到app上,从而制作app的文章编辑界面。

搜索的功能制作

数据自然是从api里面获取,ng如何获取api里的数据呢?我们来看看,主要是利用http,获取数据,然后利用then方法进行回调,得到 http,获取数据,然后利用then方法进行回调,得到scope.data的数据。

angular.module('service')
.service('ArticleService', function ($http) {
return {searchArticle: function(title){ return $http.get('api/article/search',{ data: { title:title } }); } }; });

这里我们声明了ArticleService,并给它返回了api数据,那么我们将该依赖注入要调用的页面即可调用其方法。还是看下代码:通常服务调用

API返回的数据放在一个文件夹里面而控制数据的控制器单独放在一个文件夹里面,那么我们来看下控制器里是如何回调api的数据。

angular.module('article.controllers')
.controller('serviceCtrl', function ($scope, $rootScope, $filter, $timeout, $state, $stateParams, ContentService,, ArticleService, type) {

注意,你需要把ArticleService注入到控制器里面,然后才能回调数据。怎么回调数据呢?看下面的代码:

var arcfullSearch={
text: '',
result: [],
selected: [], //选择后的数据先存入数组
beginSearch: function () {
var self = this;
var text = self.text.trim();
if(!text) return;
ArticleService.searchArticle(text).then(
function (data){ 
//获取得到数据 第二个data表示获取数组里的内容,第一个是传进来的参数 
self.result = data.data;//获取数据
}, function (err) {
console.log(err);
}); 
},
};

OK,我们成功的回调到了函数数据。关于搜索部分,下面总结下不清楚的知识点。

总结知识点

1.如何将数组变成字符串的写法

AngularJs定制样式插入到ueditor中的问题小结

2.关于replace替换为函数的用法

ECMAScript规定,replace()方法的参数replacement可以是函数也可以是字符串。在这种情况下,每个匹配都调用该函数,它返回的字

符串将替换文本使用。function回调函数返回的第一个参数表示匹配到的字符,第二个以及往后都是匹配到的分组数据。来看下代码。

3.关于[p.slice(0,index)][p.slice(index+1)]是什么鬼?调试一下就知道了。

AngularJs定制样式插入到ueditor中的问题小结

再来看待合成代码就明白了什么意思。

var arr = serve.map(function (xx) {
return item.html.replace(/{{([\w\.]+?)}}/gi, function (match, p) {
var index = p.indexOf('.'); 
if (index > 0) {
return formatField(xx[p.slice(0, index)][p.slice(index+1)]);
} else {
return formatField(xx[p]);
}
}); 
});

4.关于定时器setTimeout的原理,先来看看代码

AngularJs定制样式插入到ueditor中的问题小结

为什么输出的是-1呢?我们先来看下原理setTimeout()

setTimeout() 只执行 code 一次。如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout()。

setTimeout 运用在延迟一段时间,再进行某项操作。即在载入后延迟指定时间后,去执行一次表达式,仅执行一次。

setTimeout(代码,延迟时间);

该延迟时间并不是你期望的时间,不同的浏览器,延迟时间不一样。拿上面例子来看,也就是说延迟时间并不是上面的0。对比来看

AngularJs定制样式插入到ueditor中的问题小结

也就是说setTimeout只执行一次,但时间并不是0,具体为多少秒延迟,不确定。那么就不奇怪,为什么出现的为-1了。我们来分析下该程序,

当i=3时,while(3)后,i减为2,执行一个setTimeout

当i=2时,while(2)后,i减为1,执行一个setTimeout

当i=1时,while(0)后,i减为2,执行一个setTimeout

当i=0时,while(0)后,i减为-1,此时程序结束,但设置setTimeout的时间间隔 为0 不会理解 执行的,会插入到线程的执行队列中,等到i

变为-1时候,才会执行前面的三个setTimeout,而此时i已经变为-1了,所以,输出为-1.此时打印的console是之前那个console打印出来的

setTimeout是异步代码,也就是说这样写setTimeout(fn, 100)并不代表fn肯定在100毫秒之后马上就执行,延迟很可能会更长。因为所有的

异步事件(包括计时器、或者一个 XMLHttpRequest 完成)仅仅当程序执行期间有空闲的时候才会执行,不是你规定了什么时候就什么时候执行。

以上所述是小编给大家介绍的AngularJs定制样式插入到ueditor中的问题小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js判断iframe内的网页是否滚动到底部触发事件
Mar 18 Javascript
js如何判断用户是否是用微信浏览器
Jun 05 Javascript
seaJs的模块定义和模块加载浅析
Jun 06 Javascript
JavaScript遍历table表格中的某行某列并打印其值
Jul 08 Javascript
js获取当前日期时间及其它操作汇总
Apr 17 Javascript
实例讲解JS中setTimeout()的用法
Jan 28 Javascript
分分钟玩转Vue.js组件
Oct 25 Javascript
JS实现探测网站链接的方法【测试可用】
Nov 08 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
Jan 08 Javascript
javascript防篡改对象实例详解
Apr 10 Javascript
Angular 5.0 来了! 有这些大变化
Nov 15 Javascript
微信小程序图片自适应实现解析
Jan 21 Javascript
jQuery的ajax和遍历数组json实例代码
Aug 01 #Javascript
JS遍历页面所有对象属性及实现方法
Aug 01 #Javascript
AngularJS 基础ng-class-even指令用法
Aug 01 #Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
Aug 01 #Javascript
AngularJS入门教程之ng-class 指令用法
Aug 01 #Javascript
Three.js学习之正交投影照相机
Aug 01 #Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
Aug 01 #Javascript
You might like
Search Engine Friendly的URL设计
2006/10/09 PHP
php实现可运算的验证码
2015/11/10 PHP
学习PHP session的传递方式
2016/06/15 PHP
js实现仿QQ秀换装效果的方法
2015/03/04 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
2016/05/03 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法
2017/03/08 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
微信小程序使用Socket的实例
2017/09/19 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
9种方法优化jQuery代码详解
2020/02/04 jQuery
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
python抓取百度首页的方法
2015/05/19 Python
Python编写简单的HTML页面合并脚本
2016/07/11 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
django model object序列化实例
2020/03/13 Python
ORACLE第二个十问
2013/12/14 面试题
介绍一下linux文件系统分配策略
2013/02/25 面试题
党委书记岗位职责
2013/11/24 职场文书
公司财务自我评价分享
2013/12/17 职场文书
旅游节目策划方案
2014/05/26 职场文书
省级优秀毕业生主要事迹
2014/05/29 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
房屋授权委托书范本
2014/10/07 职场文书
军训后的感想
2015/08/07 职场文书
中学教师教学工作总结
2015/08/13 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js
python 字典和列表嵌套用法详解
2021/06/29 Python