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 this 的一些学习总结
Aug 02 Javascript
js模拟滚动条(横向竖向)
Feb 22 Javascript
用jquery中插件dialog实现弹框效果实例代码
Nov 15 Javascript
jQuery实现鼠标划过展示大图的方法
Mar 09 Javascript
javascript实现十秒钟后注册按钮可点击的方法
May 13 Javascript
AngularJS实现全选反选功能
Dec 08 Javascript
js+css3实现旋转效果
Jan 20 Javascript
原生js 封装get ,post, delete 请求的实例
Aug 11 Javascript
利用vue.js把静态json绑定bootstrap的table方法
Aug 28 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
May 21 Javascript
Vue代码整洁之去重方法整理
Aug 06 Javascript
JavaScript中变量提升和函数提升的详解
Aug 07 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
php在页面中调用fckeditor编辑器的方法
2011/06/10 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
为原生js Array增加each方法
2012/04/07 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
2016/11/03 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
微信小程序报错: thirdScriptError的错误问题
2020/06/19 Javascript
[36:13]Mineski vs iG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python判断端口是否打开的实现代码
2013/02/10 Python
更改Python命令行交互提示符的方法
2015/01/14 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
2018/06/14 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
python3.8与pyinstaller冲突问题的快速解决方法
2020/01/16 Python
python numpy数组中的复制知识解析
2020/02/03 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
vscode配置anaconda3的方法步骤
2020/08/08 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
上海奥佳笔试题面试题
2016/11/16 面试题
Unix如何添加新的用户
2014/08/20 面试题
超市促销实习自我鉴定
2013/09/23 职场文书
党风廉政承诺书
2014/03/27 职场文书
小学生安全保证书
2015/05/09 职场文书
青少年法制教育心得体会
2016/01/14 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js