写点什么

Knockout 组件能够帮助你更好地安排应用的代码结构

  • 2014-08-31
  • 本文字数:1660 字

    阅读完需:约 5 分钟

Knockout 最近发布了 3.2.0 版本,这次更新最大的改进之一就是引入了组件(Component)的概念,通过配合使用组件与自定义元素(Custom element),你能够方便地将应用分解为可重用的小部件(widget)、区域(section)或页面。

组件能够将一个视图模型(View model)与一个模板组合为一个封装包,这方面的例子可以是一个导航栏或者是进度面板。你可以使用“组件绑定”将这些组件与普通的div 元素绑定在一起,不过还有一种更为强大的用法存在:你可以在应用中使用自定义元素

举个例子来说明一下,你可以按照如下方式定义一个组件(需要注意的是,在真实的项目中,你应该将视图与视图模型分别定义在不同的文件中):

复制代码
ko.components.register('like-widget', {
viewModel: function(params) {
// Data: value is either null, 'like', or 'dislike'
this.chosenValue = params.value;
// Behaviors
this.like = function() { this.chosenValue('like'); }.bind(this);
this.dislike = function() { this.chosenValue('dislike'); }.bind(this);
},
template:
'<div class="like-or-dislike" data-bind="visible: !chosenValue()">\
<button data-bind="click: like">Like it</button>\
<button data-bind="click: dislike">Dislike it</button>\
</div>\
<div class="result" data-bind="visible:chosenValue">\
You <strong data-bind="text: chosenValue"></strong> it\
</div>'

随后,你可以在视图中配合定义了“products”这个属性的视图模型使用这个组件:

复制代码
<ul data-bind="foreach:products">
<li class="product">
<strong data-bind="text: name"></strong>
<like-widget params="value: userRating"></like-widget>
</li>
</ul>

这种方式的优势在于,这个 like-widget 可以在多个地方进行重用,并且相关的所有逻辑也进行了独立的封装。将应用程序进行分解多个组件,可以大大简化代码的创建、理解与维护难度。

这种方式与 AngularJS 的理念非常相似,后者也是通过自定义组件的方式对 html 元素进行功能扩展。此外,这种方式也类似于 WebComponents标准中关于自定义元素的这一节内容,该标准现在还在不断改进中。总的来说,开发者们对于这个新特性的出现感到十分兴奋

此次更新还带来了其它一些改进:

  • ko.pureComputed - 这是 ko.computed 的一种变体形式,它提供了更好的性能与内存管理方式。这一特性只对推断式可观察对象(computed observable)有效,这种对象在推断结果时不会造成任何副作用,而且它的结果完全是由应用中其它可观察对象的值产生的。换句话说,这一特性要求这种推断式可观察对象的值不能够受到任何来自于整个依赖跟踪体系结构之外的隐藏值或是状态值的影响。
  • 新的“textInput”绑定,它能够将元素或
2014-08-31 14:132851
用户头像

发布了 428 篇内容, 共 184.1 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

JavaScript 中深拷贝方法structuredClone

devpoint

JavaScript 深拷贝与浅拷贝 lodash structuredClone

软件测试 | Mock是什么?

测吧(北京)科技有限公司

测试

SaaS+、SaaS的机遇都存在,但不要试图找最短成功路径,该犯的错都得走一遍

B Impact

OKR之剑·总结篇01:如何开好一场OKR复盘会

vivo互联网技术

团队管理 OKR

架构训练营一作业

null

aspnetcore 原生 DI 实现基于 key 的服务获取

newbe36524

C# Docker Kubernetes

得物热点探测技术架构设计与实践

得物技术

热点

「 Java基础-Lambda 」试试Lambda表达式?通俗易懂得嘞!

小刘学编程

Lambda 代码优化 java 高级编程

MySql基础-笔记5 -WHERE 、UPDATE、DELETE、LIKE、UNION使用

MySQL 数据库

得物容器SRE探索与实践

得物技术

容器

【kafka专栏】kafka专栏目录整理(建议收藏不迷路)

石臻臻的杂货铺

kafka

长安链入选“2022科创中国”开源创新榜

科技热闻

日日顺于贞超:供应链数字化要做到有数、有路、有人

联营汇聚

浅谈新媒体运营岗位的发展前景

石头IT视角

【立哥】【每日一个小知识】你所知道的牛郎织女故事是真的吗?

Lee Chen

Unittest接口和UI自动化测试框架中的发送邮件服务如何使用?

Python 自动化测试 unittest 邮件服务

2023-02-21:请用go语言调用ffmpeg,解码mp4文件,输出视频信息和总帧数。

福大大架构师每日一题

golang ffmpeg 福大大

定了!Python3.7,今年停止更新!

程序员晚枫

Python 软件 下载 版本

自研的内存分析利器开源了!Android Bitmap Monitor 助你定位不合理的图片使用

拭心

android 性能优化 BitMap 内存优化

MathType7.0简体中文汉化版下载

茶色酒

MathType2023

CorelDRAW2023软件新功能抢先看

茶色酒

CorelDraw2023

OSS Compass开源指南针发布,我国首个开源生态健康评估平台正式诞生

Geek_2d6073

业务架构那点事(1)业务架构师就是在“盖房子”

涛哥 数字产品和业务架构

企业架构 业务架构

秒懂算法 | 莫队算法

TiAmo

算法 暴力猜解

MySql基础-笔记4 -数据表创建、删除和数据插入、查询等操作

MySQL 数据库 删除 创建

流处理计算平台 StreamPark 2.0.0 重磅发布,首个 Apache 版本终于来了

ApacheStreamPark

flink spark 流处理 StreamPark

【深度挖掘 RocketMQ底层源码】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-上)

码界西柚

Apache RocketMQ 2月日更 运行原理 拉取模式

LeetCode题解:938. 二叉搜索树的范围和,BFS,JavaScript,详细注释

Lee Chen

JavaScript 算法 LeetCode

易观千帆 | 2023年1月银行APP月活跃用户规模盘点

易观分析

金融 银行 手机银行

架构实战营模块6 拆分电商系统为微服务

西山薄凉

「架构实战营」

MySql基础-笔记6 -排序、分组、连接的使用、NULL值处理

MySQL 数据库

Knockout组件能够帮助你更好地安排应用的代码结构_JavaScript_Roopesh Shenoy_InfoQ精选文章