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

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

关注

评论

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

记一次GC频繁且间隔较长解决实战总结

AI乔治

Java 架构 JVM GC

专访阿里云 Serverless 负责人:无服务器不会让后端失业

阿里巴巴云原生

Serverless 微服务 云原生 CloudNative 无服务器

为什么short、byte会被提升为int?及基本类型的真实大小

烫烫烫个喵啊

Java JVM

「五大常用算法」一文搞懂分治算法

bigsai

算法 分治算法;

AOT星辰生态系统APP开发|AOT星辰生态软件开发

系统开发 现成系统

年轻人,快来看看分布式与集群的区别是什么?

程序员小灰

redis 分布式 后台开发 集群 Linux服务器开发

接口测试之post常见数据提交方式

测试人生路

post 接口测试

高并发的核心 - AQS【哪些琐是基于AQS来实现的】

Java架构师迁哥

面对日益严峻的网络安全问题,CDN可以做什么?

阿里云Edge Plus

整天都在讨论使用SpringBoot,可你居然连缓存都不清楚

小Q

Java 缓存 学习 面试 springboot

从零开始搭建Kafka+SpringBoot分布式消息系统

小Q

kafka zookeeper 学习 面试 springboot

3本书免费学习数据科学与统计学

计算机与AI

统计学

AWS IoT Core设计解析

soolaugust

边缘计算 AWS 工业4.0 工业物联网 iiot

深入解读:KubeVela 与 PaaS 有何不同?

阿里巴巴云原生

阿里云 开源 容器 云原生 CloudNative

将项目发布到 Homebrew 官方仓库

郭旭东

macos brew homebrew

了不起的 Deno:带你极速获取各大平台今日热榜

华为云开发者联盟

Java 安全 deno

架构师训练营 -week11-作业

大刘

极客大学架构师训练营

框架设计

raox

极客大学架构师训练营

数字货币管理三大新模式

CECBC

数字货币

双非本硕四面百度竟意外成功?看完我的面试经历 网友都称:过于优秀

比伯

Java 编程 架构 面试 计算机

解锁高速 IT 团队利器:Jira Service Management

Atlassian

DevOps Atlassian Jira ITSM ITIL

小心踩雷,一次Java内存泄漏排查实战

AI乔治

Java 架构 JVM 内存

淦!终于有人把Java 8和Spring 5完美合体了,业界堪称“神迹”

Java架构追梦

Java spring 架构 面试 springboot

🤳你要悄悄变优秀,然后惊艳所有人

蚂蚁集团移动开发平台 mPaaS

mPaaS 智能投放 界面改版 产品资讯

语音识别端到端模型解读:FSMN及其变体模型

华为云开发者联盟

大数据 模型 语音识别

华为云&跟谁学|华为云API入门学习赛·AI人脸识别 未来工程师梦想的起点

DT极客

SpringBoot整合Mybatis-Plus 实战之动态SQL,Mybatis最拿得出手的功能之一

比伯

Java 编程 架构 面试 计算机

稳坐开发领域霸主之位,揭秘C语言无可取代的几大原因!

华为云开发者联盟

c rust Go 语言

LiteOS基于Sensorhub的超声波模组移植

华为云开发者联盟

物联网 LiteOS 超声波

开发技巧 | mPaaS 小程序自定义事件,如何取消注册?

蚂蚁集团移动开发平台 mPaaS

小程序 API mPaaS

「linux」Socket缓存是如何影响TCP性能的?

linux大本营

Linux 后台开发 socket 架构师 TCP/IP

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