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 相关文章推荐
网页常用特效代码整理
Jun 23 Javascript
IE和Mozilla的兼容性汇总event
Aug 12 Javascript
网页禁用右键实现代码(JavaScript代码)
Oct 29 Javascript
js 模仿锚点定位的实现方法
Nov 19 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
Dec 19 Javascript
基于BootStrap实现简洁注册界面
Jul 20 Javascript
微信小程序实现列表下拉刷新上拉加载
Jul 29 Javascript
关于vue表单提交防双/多击的例子
Oct 31 Javascript
前端性能优化建议
Sep 17 Javascript
浅谈Vue使用Elementui修改默认的最快方法
Dec 05 Vue.js
原生js中运算符及流程控制示例详解
Jan 05 Javascript
JavaScript模拟实现网易云轮播效果
Apr 04 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运行时强制显示出错信息的代码
2011/04/20 PHP
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
php构造函数的继承方法
2015/02/09 PHP
PHP的引用详解
2015/02/22 PHP
php文件管理基本功能简单操作
2017/01/16 PHP
php 判断页面或图片是否经过gzip压缩的方法
2017/04/05 PHP
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
js通过iframe加载外部网页的实现代码
2015/04/05 Javascript
Bootstrap表格制作代码
2017/03/17 Javascript
switchery按钮的使用方法
2017/12/18 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
python连接mysql实例分享
2016/10/09 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
Python搭建代理IP池实现获取IP的方法
2019/10/27 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
Python实现自动访问网页的例子
2020/02/21 Python
python2 对excel表格操作完整示例
2020/02/23 Python
Python pytesseract验证码识别库用法解析
2020/06/29 Python
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
String s = new String(“xyz”);创建了几个String Object?
2015/08/05 面试题
赔偿协议书范本
2014/04/15 职场文书
教育基金募捐倡议书
2014/05/14 职场文书
新教师岗前培训方案
2014/06/05 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
租车协议书范本2014
2014/11/17 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
2016公务员年度考核评语
2015/12/01 职场文书
CentOS安装Nginx并部署vue
2022/04/12 Servers
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python