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 相关文章推荐
extjs form textfield的隐藏方法
Dec 29 Javascript
javascript中检测变量的类型的代码
Dec 28 Javascript
js中判断文本框是否为空的两种方法
Jul 31 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
Nov 04 Javascript
JavaScript地理位置信息API
Jun 11 Javascript
AngularJs Managing Service Dependencies详解
Sep 02 Javascript
JS对大量数据进行多重过滤的方法
Nov 04 Javascript
Vue Ajax跨域请求实例详解
Jun 20 Javascript
JS实现的按钮点击颜色切换功能示例
Oct 19 Javascript
详解webpack babel的配置
Jan 09 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
Feb 08 Javascript
JS精髓原型链继承及构造函数继承问题纠正
Jun 16 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获取页面执行时间的方法(推荐)
2016/12/10 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
2018/04/12 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
javascript 最常用的10个自定义函数[推荐]
2009/12/26 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
JavaScript实现复制或剪切内容到剪贴板功能的方法
2016/05/23 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
js动态引入的四种方法
2018/05/05 Javascript
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
Element UI框架中巧用树选择器的实现
2018/12/12 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
Python时间的精准正则匹配方法分析
2017/08/17 Python
对pandas中Series的map函数详解
2018/07/25 Python
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
Css3+Js制作漂亮时钟(附源码)
2013/04/24 HTML / CSS
英国最大的百货公司:Harrods
2016/08/18 全球购物
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
竞选学生会演讲稿
2014/04/25 职场文书
员工考核评语大全
2014/04/26 职场文书
绿色家庭事迹材料
2014/05/01 职场文书
岗位说明书标准范本
2014/07/30 职场文书
2015年项目工作总结
2015/04/29 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
采购员工作总结范文
2015/08/12 职场文书
幼儿园教师教学反思
2016/03/02 职场文书