写点什么

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:132900
用户头像

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

关注

评论

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

聊聊Java底层那些事

码农参上

内容合集 签约计划第二季 技术专题合集 技术专区合集

【Promise 源码学习】第十四篇 - 实现工具方法 promisify

Brave

源码 Promise 12月日更

更好用的Web端H265播放技术架构

百度开发者中心

智能视频

提高儿童被拐意识

Tiger

28天写作

前端开发JS框架之jQuery的基础知识分享

@零度

大前端 ​jQuery

ios技术分享| iOS 发布 framework 到 Cocoapods 以及常见问题

anyRTC开发者

ios 音视频 WebRTC CocoaPods Framework

大数据开发之Kafka 存储选型

@零度

大数据 kafka

kubernetes系列随笔03:kubernetes的发展和设计思想

Geek_cd6rkj

Docker Kubernetes 声明式

直播预告丨“Hello Ability:从页面跳转开始”周三晚不见不散

HarmonyOS开发者

HarmonyOS

2021年财经中国年会暨第十九届中国财经风云榜

大咖说

直播 财经 财经峰会

Flink是如何支持批流一体的

编程江湖

大数据 flink

Linux一学就会之文件的归档和压缩tar命令

学神来啦

Linux 运维 ZIP tar命令 linux云计算

百度文库新一代文档阅读器!核心技术点全解析!

百度Geek说

大前端 文档 百度文库

测试 —— DevOps 快速交付的最大瓶颈

飞算JavaAI开发助手

等保2.0正式发布了吗?核心思想包括什么?

行云管家

网络安全 等保 等级保护 等保2.0

如期而至-用户购买时间预测(上)

索信达控股

模型 购买预测 购买行为 精准营销

详解布隆过滤器的原理和实现

万俊峰Kevin

golang 微服务 微服务架构 布隆过滤器 go-zero

信息网络向价值网络演进过程中产品形态的思考

拍乐云Pano

服务器减少一半,TDengine在华自科技的落地实践

TDengine

数据库 tdengine 时序数据库

一劳永逸,使用 PicGo + GitHub 搭建个人图床工具

AlwaysBeta

GitHub 工具 PicGo 图床

Vue路由守卫有哪些,怎么设置,使用场景等

编程江湖

Vue 路由器

协程实现方式——从程序控制流转移谈起

Jowin

协程原理

架构实战营模块一作业

Sindorei

「架构实战营」

效率高到爆炸的IT运维软件您安装了吗?

行云管家

运维 IT运维 运维i工具

全网最全-混合精度训练原理

科技热闻

教你用 JavaScript 设计一个 Neumorphism 风格的数字时钟 (代码详解)

海拥(haiyong.site)

大前端 js 28天写作 签约计划第二季 12月日更

企业管理升级,如何加速信息化转型?

雯雯写代码

企业管理 信息化

Tapdata Cloud 版本上新!新增ClickHouse,ADB MySQL等5个数据源支持

tapdata

MySQL oracle

数据库事务与事务隔离级别

编程江湖

数据库 java编程

关于RocketMQ事务方面Demo

WebView秒开方案探索

得物技术

CSS JavaScript html webview 大前端

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