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 相关文章推荐
Jquery 获取表单text,areatext,radio,checkbox,select值的代码
Nov 12 Javascript
JS获取iframe中longdesc属性的方法
Apr 01 Javascript
javascript的几种继承方法介绍
Mar 22 Javascript
表单中单选框添加选项和移除选项
Jul 04 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
Mar 16 Javascript
javascript数组拍平方法总结
Jan 20 Javascript
原生JS实现多个小球碰撞反弹效果示例
Jan 31 Javascript
vue-cli开发环境实现跨域请求的方法
Apr 07 Javascript
vue实现div拖拽互换位置
Jul 29 Javascript
JS数组方法slice()用法实例分析
Jan 18 Javascript
vue 在methods中调用mounted的实现操作
Aug 07 Javascript
浅谈vue2的$refs在vue3组合式API中的替代方法
Apr 18 Vue.js
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利用COM对象访问SQLServer、Access
2006/10/09 PHP
解析php中const与define的应用区别
2013/06/18 PHP
php中数字0和空值的区别分析
2014/06/05 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
php桥接模式应用案例分析
2019/10/23 PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
2019/12/12 PHP
为jQuery.Treeview添加右键菜单的实现代码
2010/10/22 Javascript
jQuery关于导航条背景切换效果实现示例
2013/09/04 Javascript
B/S模式项目中常用的javascript汇总
2013/12/17 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
babel基本使用详解
2017/02/17 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
jquery.picsign图片标注组件实例详解
2018/02/02 jQuery
微信小程序实现页面浮动导航
2019/01/28 Javascript
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
小程序接入腾讯位置服务的详细流程
2020/03/03 Javascript
python函数装饰器用法实例详解
2015/06/04 Python
JSON Web Tokens的实现原理
2017/04/02 Python
Python读取Word(.docx)正文信息的方法
2018/03/15 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
python适合做数据挖掘吗
2020/06/16 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
AmazeUI 评论列表的实现示例
2020/08/13 HTML / CSS
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
领导干部群众路线个人对照检查材料思想汇报
2014/09/30 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
公务员政审个人总结
2015/02/12 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书