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 相关文章推荐
script的async属性以非阻塞的模式加载脚本
Jan 15 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
Jul 10 Javascript
一个非常全面的javascript URL解析函数和分段URL解析方法
Apr 12 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
Jun 23 Javascript
使用jquery提交form表单并自定义action的实现代码
May 25 Javascript
老生常谈JavaScript 正则表达式语法
Aug 20 Javascript
jQuery实现弹幕效果
Feb 17 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
Sep 27 Javascript
开发用到的js封装方法(20种)
Oct 12 Javascript
vue elementui form表单验证的实现
Nov 11 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
Mar 19 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
Sep 14 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
改变Apache端口等配置修改方法
2008/06/05 PHP
phpmyadmin 3.4 空密码登录的实现方法
2010/05/29 PHP
PHP中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
DWR Ext 加载数据
2009/03/22 Javascript
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
分享Javascript中最常用的55个经典小技巧
2013/11/29 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
js实现登录与注册界面
2017/11/01 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
Python字符串格式化输出方法分析
2016/04/13 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
python基础教程之Filter使用方法
2017/01/17 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
python生成不重复随机数和对list乱序的解决方法
2018/04/09 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
将pytorch转成longtensor的简单方法
2020/02/18 Python
Python装饰器用法与知识点小结
2020/03/09 Python
python 实现批量图片识别并翻译
2020/11/02 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
2020/11/27 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
就业自荐书
2013/12/05 职场文书
品牌服务方案
2014/06/03 职场文书
雨花台导游词
2015/02/06 职场文书
讲文明倡议书
2015/04/29 职场文书
关于教师节的广播稿
2015/08/19 职场文书
高中团支书竞选稿
2015/11/21 职场文书
Centos环境下Postgresql 安装配置及环境变量配置技巧
2021/05/18 PostgreSQL