knockoutjs动态加载外部的file作为component中的template数据源的实现方法


Posted in Javascript onSeptember 01, 2016

玩过knockoutjs的都知道,有一个强大的功能叫做component,而这个component有个牛逼的地方就是拥有自己的viewmodel和template,比如下面这样:

ko.components.register('message-editor', {
viewModel: function(){},
template:""
});

很显然,viewmodel就是function函数区,而template就是模板区,然后通过register函数将component注册到knockout中,下面我们演示一个简单的功能,就是动态的显示当前“input”内容的length长度。

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<meta charset="utf-8" />
<script src="jquery-1.8.2.js"></script>
<script src="knockoutjs.js"></script>
</head>
<body>
<div data-bind='component: "message-editor"'></div>
<script type="text/javascript">
ko.components.register('message-editor', {
viewModel: function (params) {
this.text = ko.observable(params && params.initialText || '');
},
template: 'Message: <input data-bind="value: text" /> '
+ '(length: <span data-bind="text: text().length"></span>)'
});
ko.applyBindings();
</script>
</body>
</html>

请仔细看一下这段代码,当前的component会将template模板inject到html的div的标签中,而且这个template标记中还有一个text元素的绑定,而这个(text().length)的数据源刚好就是viewModel中的this.text..对吧。。。有了这两个的合一,我们最后的html展示如下:

knockoutjs动态加载外部的file作为component中的template数据源的实现方法

接下来我们随便输入一些数字,移开鼠标,这个时候会触发input的change事件,比如下面这样。

knockoutjs动态加载外部的file作为component中的template数据源的实现方法

是不是好吊??? 当然有些人可能要问,如果在input呈现的时候赋予一点默认值呢???可不可以呢?当然也是可以的,这个时候我们可以在data-bind中默认赋予值就ok啦。。。比如下面这样:

<body>
<h4>Second instance, passing parameters</h4>
<div data-bind='component: { name: "message-editor", params: { initialText: "Hello, world!" }}'></div>
<script type="text/javascript">
ko.components.register('message-editor', {
viewModel: function (params) {
this.text = ko.observable(params && params.initialText || '');
},
template: 'Message: <input data-bind="value: text" /> '
+ '(length: <span data-bind="text: text().length"></span>)'
});
ko.applyBindings();
</script>
</body>

可以看到,上面的代码中我通过在component中的params对象中加入一个initialText属性,这个时候就可以将这个initialText动态的注入到我们的viewModel中,然后我们的input和span元素通过data-bind 订阅了这个viewModel中的this.text监控属性,这个时候就出现了实时更新操作了,迫不及待的看一下吧~

knockoutjs动态加载外部的file作为component中的template数据源的实现方法

一:问题分析

好了,通过上面的演示,你或许发现到了如下两个问题,第一个问题就是好强大,只要你register就可以了,根本不需要通过applyBindings来施加一个viewmodel,这样就实现了页面的模块化,真的好便捷~ 所以这个问题是一个好事情, 第二个问题就是我们的template模板中的内容是通过“硬编码“的形式,也就是如果这个内容有很多,比如有100行,200行,那我们是不是疯了??? 就是你能耐再大也没法一一拼接起来,就算拼起来,维护成本也太大了,所以问题来了,如何将template的content动态化??? 比如现实中我们看到的 百度文库 的页面。。。如下图:

knockoutjs动态加载外部的file作为component中的template数据源的实现方法

这个页面中,有很多的模块,比如我圈出来的上面3个,这三个模块中的html肯定还是很多的吧~~~

二:template动态获取

html内容的动态获取,通常有两种方式,第一种就是RequireJs,当然你需要引用这么一个js,第二种就是我们重写他们的模板,当然这篇我们讲解后面的这种方式,我们要做的就是重写component中的loadTemplate函数,然后替换默认的defaultLoader加载器,是不是很简单呢???

1. 重写loadtemplate方法

//第一步:重写loadTemplate方法
var templateFromUrlLoader = {
loadTemplate: function(name, templateConfig, callback) {
if (templateConfig.fromUrl) {
var fullUrl = '/' + templateConfig.fromUrl
//ajax动态获取外部的file内容
$.get(fullUrl, function(markupString) {
ko.components.defaultLoader.loadTemplate(name, markupString, callback);
});
} else {
callback(null);
}
}
};
//替换原来的defaultLoader,实现新的templateFromUrlLoader
ko.components.loaders.unshift(templateFromUrlLoader);

2. 将hard codeing 放入到外部的file,比如我新建了一个file.html文件。

knockoutjs动态加载外部的file作为component中的template数据源的实现方法

3. 再register组件,然后在template标记上引用外面文件路径,比如下面的{ fromUrl: 'file.html' }

ko.components.register('message-editor', {
viewModel: function (params) {
this.text = ko.observable(params && params.initialText || '');
},
template: { fromUrl: 'file.html' },
});

好了,所有功能都准备完毕了,我们浏览一下页面,看看是啥样的???

knockoutjs动态加载外部的file作为component中的template数据源的实现方法

终于大功搞成了,对不对撒~~~然后是不是就可以延伸到上面介绍的“百度文库”的例子,我们可以把各个模块的html放到一个单独的文件中.

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<meta charset="utf-8" />
<script src="jquery-1.8.2.js"></script>
<script src="knockoutjs.js"></script>
</head>
<body>
<div data-bind='component: { name: "message-editor", params: { initialText: "你好撒!!!" }}'></div>
<script type="text/javascript">
//第一步:重写loadTemplate方法
var templateFromUrlLoader = {
loadTemplate: function (name, templateConfig, callback) {
if (templateConfig.fromUrl) {
var fullUrl = '/' + templateConfig.fromUrl
//ajax动态获取外部的file内容
$.get(fullUrl, function (markupString) {
ko.components.defaultLoader.loadTemplate(name, markupString, callback);
});
} else {
callback(null);
}
}
};
//替换原来的defaultLoader,实现新的templateFromUrlLoader
ko.components.loaders.unshift(templateFromUrlLoader);
ko.components.register('message-editor', {
viewModel: function (params) {
this.text = ko.observable(params && params.initialText || '');
},
template: { fromUrl: 'file.html' },
});
ko.applyBindings();
</script>
</body>
</html>

以上所述是小编给大家介绍的knockoutjs动态加载外部的file作为component中的template数据源的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript中自定义对象的属性方法分享
Jul 12 Javascript
javascript 函数及作用域总结介绍
Nov 12 Javascript
网页右侧悬浮滚动在线qq客服代码示例
Apr 28 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
Mar 04 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
Apr 25 Javascript
Jquery中request和request.form和request.querystring的区别
Nov 26 Javascript
JavaScript——DOM操作——Window.document对象详解
Jul 14 Javascript
基于jQuery的select下拉框选择触发事件实例分析
Nov 18 Javascript
详解vue表单验证组件 v-verify-plugin
Apr 19 Javascript
详解vue.js的devtools安装
May 26 Javascript
史上最全JavaScript常用的简写技巧(推荐)
Aug 17 Javascript
vue iview实现动态新增和删除
Jun 17 Javascript
深入理解jQuery3.0的domManip函数
Sep 01 #Javascript
总结AngularJS开发者最常犯的十个错误
Aug 31 #Javascript
ES6记录异步函数的执行时间详解
Aug 31 #Javascript
基于angularjs实现图片放大镜效果
Aug 31 #Javascript
用AngularJS的指令实现tabs切换效果
Aug 31 #Javascript
简洁实用的BootStrap jQuery手风琴插件
Aug 31 #Javascript
AngularJS实现一次监听多个值发生的变化
Aug 31 #Javascript
You might like
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
javascript 计算两个整数的百分比值
2009/12/26 Javascript
了不起的node.js读书笔记之mongodb数据库交互
2014/12/22 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
2015/12/02 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
纯前端JavaScript实现Excel IO案例分享
2016/08/26 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
详细分析React 表单与事件
2020/07/08 Javascript
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
python实现socket客户端和服务端简单示例
2014/02/24 Python
python使用win32com库播放mp3文件的方法
2015/05/30 Python
Python使用微信SDK实现的微信支付功能示例
2017/06/30 Python
对numpy 数组和矩阵的乘法的进一步理解
2018/04/04 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
Python3多线程基础知识点
2019/02/19 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
2019/03/01 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
python代码中怎么换行
2020/06/17 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
解决pycharm修改代码后第一次运行不生效的问题
2021/02/06 Python
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
天猫精选:上天猫,就够了
2016/09/21 全球购物
2014年秋季新学期寄语
2014/08/02 职场文书
垃圾分类的活动方案
2014/08/15 职场文书
车辆年检委托书范本
2014/10/14 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL