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的jqDnR拖拽溢出的修改
Feb 12 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
Mar 10 Javascript
js中关于String对象的replace使用详解
May 24 Javascript
JavaScript判断是否为数字的4种方法及效率比较
Apr 01 Javascript
基于JavaScript实现无限加载瀑布流
Jul 21 Javascript
浅谈express 中间件机制及实现原理
Aug 31 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
Nov 20 Javascript
bootstrap table列和表头对不齐的解决方法
Jul 19 Javascript
Webpack按需加载打包chunk命名的方法
Sep 22 Javascript
JavaScript实现动态生成表格
Aug 02 Javascript
vue实现移动端H5数字键盘组件使用详解
Aug 25 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
Oct 30 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入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
浅谈php错误提示及查错方法
2015/07/14 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
PHP实现支持CURL字符串证书传输的方法
2019/03/23 PHP
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
深入理解javascript的执行顺序
2014/04/04 Javascript
jQuery源码解读之removeAttr()方法分析
2015/02/20 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
JavaScript使用Prototype实现面向对象的方法
2015/04/14 Javascript
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
jQuery添加新内容的四个常用方法分析【append,prepend,after,before】
2019/03/19 jQuery
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
python利用smtplib实现QQ邮箱发送邮件
2020/05/20 Python
pyqt5的QComboBox 使用模板的具体方法
2018/09/06 Python
Python如何使用input函数获取输入
2020/08/06 Python
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
幼儿园美术教学反思
2014/01/31 职场文书
教师师德承诺书
2014/03/26 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
初中学生操行评语
2014/12/26 职场文书
党员个人年度总结
2015/02/14 职场文书
看雷锋电影观后感
2015/06/10 职场文书
react中的DOM操作实现
2021/06/30 Javascript
Python循环之while无限迭代
2022/04/30 Python