2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

关注

评论

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

【架构师训练营 1 期】第六周作业

诺乐

5G应用的实时决策

VoltDB

5G 物联网 工业互联网 技术分享

阿里二面惨败,痛定思痛狂刷1000+面试题,成功五面上岸滴滴(面经+面试题分享)

Java架构追梦

Java 架构 腾讯 面试 蚂蚁金服

元模型驱动(二)构建元模型ーGME构建分层模型

KaYa

DDD Kaya MDA GME MDD

酷睿i5-10600KF对标锐龙7 3700X,游戏表现领先且售价更香

E科讯

基于服务设计的线上展览

京东科技开发者

云安全

从零实现一个动态表单设计(编辑)器

徐小夕

Java 编辑器 H5 Node React

sharding-jdbc 分库分表的 4种分片策略,还蛮简单的

程序员小富

Java 分库分表

Redis还可以做哪些事?

Java旅途

redis

给打工人熬一锅「毒」鸡汤

Java_若依框架教程

程序员 打工人 毒鸡汤

网络直播打赏背后的套路:刺激用户不理智消费

石头IT视角

Java-技术专题-时间工具类的使用方案

码界西柚

1分钟教你如何整理 React 知识体系

Leo

学习 大前端 React

轻量型GPU应用首选 京东智联云推出NVIDIA vGPU实例

京东科技开发者

人工智能 gpu

【架构师训练营 1 期】第六周学习总结

诺乐

Go 与异步 IO - io_uring 的思考

IceberGu

Linux 异步IO io_uring Go 语言

JAVA魅力之神奇的数组带给你不一样的乐趣

小Q

Java 学习 架构 面试 数组

java安全编码指南之:文件和共享目录的安全性

程序那些事

代码规范 java安全 java安全编码指南 java编码 程序那些事

TCP/IP 基础知识总结

苹果看辽宁体育

后端 计算机网络 计算机

为什么 React Hooks 优于 HOCs(译)

西贝

Java 翻译 React Hooks HOC

架构师训练营第 1 期第 7 周作业

业哥

元模型驱动(一)构建元模型ーGME入门

KaYa

DDD Kaya MDA GME MDD

训练营第二周课程总结

爱码士

训练营

2020双十一终极清单!阿里云CDN&视频云最全优惠攻略

阿里云Edge Plus

CDN

Flink State 误用之痛,你中招了吗?

Apache Flink

flink

面试官:讲一下缓存穿透、缓存雪崩和缓存击穿?

bigsai

redis 缓存穿透 缓存击穿 缓存雪崩

训练营第二周作业

爱码士

进“大厂”的故事

北风

职业规划 职业成长 大厂

队列实现栈的3种方法,全都击败了100%的用户!

王磊

Java 算法和数据结构

接口测试(apipost、jmeter和python脚本)

测试人生路

Python 接口测试 测试工具

物联网时代存储告急 边缘存储如何缓解存储压力?

京东科技开发者

云计算 云服务 云存储

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