KnockoutJS 3.X API 第四章之数据控制流component绑定


Posted in Javascript onOctober 10, 2016

一个例子

KnockoutJS 3.X API 第四章之数据控制流component绑定

UI源码:

<h4>First instance, without parameters</h4>
<div data-bind='component: "message-editor"'></div>
<h4>Second instance, passing parameters</h4>
<div data-bind='component: {
name: "message-editor",
params: { initialText: "Hello, world!" }
}'></div>

视图模型源码:

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();

这只是一个非常简单的例子,在开发中,一般都是将View Model和Template写成单独外部文件,然后通过ko的components.register方法注册他们,在以后的KO高级应用系列中将会进一步讲解。

API

使用component绑定有两种绑定语法

1. 快速语法:

只传递一个字符串作为组件名称,比提供任何参数。例如:

<div data-bind='component: "my-component"'></div>

如果你觉得这种写法有些死板的话,也可以传递一个监控属性,用其值作为组件名称。待以后组件名变化的时候,直接修改监控属性值即可:

<div data-bind='component: observableWhoseValueIsAComponentName'></div>

2.完整语法:

提供完整的组件参数,参数如下:

name - 注入组件的名称。可使用字符串或是监控属性。

params - 一组参数对象。通常,这是一个包含多个参数的键值对。

例如:

<div data-bind='component: {
name: "shopping-cart",
params: { mode: "detailed-list", items: productsList }
}'></div>

备注1:仅模板式的component

通常的component绑定具有ViewModel和Template,但是这并不是必须的,有些时候一个component可能只包含一个Template。例如:

ko.components.register('special-offer', {
template: '<div class="offer-box" data-bind="text: productName"></div>'
});

可以使用注入的方式,将视图模型注入给Template:

<div data-bind='component: {
name: "special-offer-callout",
params: { productName: someProduct.name }
}'></div>

在或者使用客户元素(以后的高级章节讲解)进行注入视图模型。

<special-offer params='productName: someProduct.name'></special-offer>

如上例子,HTML标记为模板名称,其属性params中注入视图模型。

备注2:component虚拟绑定

如同之前章节的虚拟绑定一样,同样是使用<!-- ko -->和<!-- /ko -->这种方式实现虚拟绑定,来达到不更改DOM元素的目的

<!-- ko component: "message-editor" -->
<!-- /ko -->

传参的例子:

<!-- ko component: {
name: "message-editor",
params: { initialText: "Hello, world!", otherParam: 123 }
} -->
<!-- /ko -->

备注3:传递标记到component绑定

<div data-bind="component: { name: 'my-special-list', params: { items: someArrayOfPeople } }">
<!-- Look, here's some arbitrary markup. By default it gets stripped out
and is replaced by the component output. -->
The person <em data-bind="text: name"></em>
is <em data-bind="text: age"></em> years old.
</div>

如上例子中,既有component绑定,也有一些DOM元素,当绑定后,my-special-list组件将会和这些DOM元素组成一个新的UI界面。在未来高级章节中,我们将会提到一个带有DOM标记的自定义companent绑定的例子。尽情期待。先卖个关子~。

内存管理(了解即可,切勿钻牛角尖)

您的视图模型类可能有一个dispose函数。如果得以运行,KO将调用这个函数在内存中删除组件,并从DOM中删除。

在一下情况,您必须使用dispose以释放垃圾收回资源。例如:

setInterval 回调后,需要明确清除。

使用clearInterval(handle)去清除他们,否则视图模型在内存常驻。

ko.computed 回调后,直到明确设置成从它们的依赖接收通知。

如果一个依赖关系是外部的对象,那么一定要使用.dispose()来释放计算监控属性,否则(也可能你的视图模型)将在内存常驻。另外,可以考虑使用一个pureComputed,以避免人工处理的需求。

Subscriptions 回掉后,需要明确清除。

如果您已经预订到外部观察时,一定要使用.dispose(),否则回调(也可能您的视图模型)将在内存中常驻。

例如:

var someExternalObservable = ko.observable(123);
function SomeComponentViewModel() {
this.myComputed = ko.computed(function() {
return someExternalObservable() + 1;
}, this);
this.myPureComputed = ko.pureComputed(function() {
return someExternalObservable() + 2;
}, this);
this.mySubscription = someExternalObservable.subscribe(function(val) {
console.log('The external observable changed to ' + val);
}, this);
this.myIntervalHandle = window.setInterval(function() {
console.log('Another second passed, and the component is still alive.');
}, 1000);
}
SomeComponentViewModel.prototype.dispose = function() {
this.myComputed.dispose();
this.mySubscription.dispose();
window.clearInterval(this.myIntervalHandle);
// this.myPureComputed doesn't need to be manually disposed.
}
ko.components.register('your-component-name', {
viewModel: SomeComponentViewModel,
template: 'some template'
});

以上所述是小编给大家介绍的KnockoutJS 3.X API 第四章之数据控制流component绑定,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
由浅到深了解JavaScript类
Sep 08 Javascript
拖动table标题实现改变td的大小(css+js代码)
Apr 16 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
Aug 30 Javascript
写给小白的JavaScript引擎指南
Dec 04 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
Jul 01 Javascript
EasyUI创建对话框的两种方式
Aug 23 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
Apr 10 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
Jun 13 Javascript
express默认日志组件morgan的方法
Apr 05 Javascript
javascript实现的字符串转换成数组操作示例
Jun 13 Javascript
微信小程序中悬浮窗功能的实现代码
Aug 02 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
Aug 22 Javascript
KnockoutJS 3.X API 第四章之click绑定
Oct 10 #Javascript
KnockoutJS 3.X API 第四章之事件event绑定
Oct 10 #Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
Oct 10 #Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
Oct 10 #Javascript
KnockoutJS 3.X API 第四章之表单value绑定
Oct 10 #Javascript
jquery操作checkbox火狐下第二次无法勾选的解决方法
Oct 10 #Javascript
浅谈jquery中使用canvas的问题
Oct 10 #Javascript
You might like
东芝TOSHIBA RP-F11电路分析
2021/03/02 无线电
PHP数据缓存技术
2007/02/14 PHP
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
基于wordpress主题制作的具体实现步骤
2013/05/10 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
javascript移出节点removeChild()使用介绍
2014/04/03 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
教你JS中的运算符乘方、开方及变量格式转换
2016/08/09 Javascript
ajax接收后台数据在html页面显示
2017/02/19 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
JS实现微信摇一摇原理解析
2017/07/22 Javascript
webpack学习笔记之优化缓存、合并、懒加载
2017/08/24 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
[43:35]EG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
Python中__name__的使用实例
2015/04/14 Python
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
Python利用Django如何写restful api接口详解
2018/06/08 Python
使用python对文件中的数值进行累加的实例
2018/11/28 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
什么是python类属性
2020/06/10 Python
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
创先争优活动方案
2014/02/12 职场文书
护理专业求职信
2014/06/15 职场文书
党员民主评议自我评价
2014/10/20 职场文书
2014年企业团支部工作总结
2014/12/10 职场文书
大学生思想道德自我评价
2015/03/09 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python