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 相关文章推荐
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
Oct 24 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
Sep 14 Javascript
jquery 实现密码框的显示与隐藏示例代码
Sep 18 Javascript
js 用CreateElement动态创建标签示例
Nov 20 Javascript
js无刷新操作table的行和列
Mar 27 Javascript
Javascript中实现trim()函数的两种方法
Feb 04 Javascript
jQuery Validate表单验证入门学习
Dec 18 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
Jan 19 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
Aug 27 Javascript
老生常谈js-react组件生命周期
May 02 Javascript
详解webpack打包第三方类库的正确姿势
Oct 20 Javascript
JavaScript实现与web通信的方法详解
Aug 07 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
关于使用coreseek并为其做分页的介绍
2013/06/21 PHP
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
Yii实现Command任务处理的方法详解
2016/07/14 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
Windows系统中安装nodejs图文教程
2015/02/28 NodeJs
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
js获取腾讯视频ID的方法
2016/10/03 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
JS库之Highlight.js的用法详解
2017/09/13 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
ES6之Proxy的get方法详解
2019/10/11 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
[48:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第二场 1月29日
2021/03/11 DOTA
Python实现XML文件解析的示例代码
2018/02/05 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
韩国女装NO.1网店:STYLENANDA
2016/09/16 全球购物
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
学术会议主持词
2014/03/17 职场文书
七夕活动策划方案
2014/08/16 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
法律意见书范文
2015/06/04 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python