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

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

关注

评论

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

promise执行顺序面试题令我头秃,你能作对几道

loveX001

JavaScript

焕新启航,「龙蜥大讲堂」2023 年度招募来了!13 场技术分享先睹为快

OpenAnolis小助手

直播 开源社区 龙蜥大讲堂 机密计算 月度主题

软件测试/测试开发 | Web自动化之显式等待与隐式等待

测试人

软件测试 自动化测试 测试开发 web测试 web自动化

2023-02-12:给定正数N,表示用户数量,用户编号从0~N-1, 给定正数M,表示实验数量,实验编号从0~M-1, 给定长度为N的二维数组A, A[i] = { a, b, c }表示,用户i报

福大大架构师每日一题

算法 rust 福大大

1行Python代码去除图片水印,网友:干干净净!

程序员晚枫

Python GitHub 开源 去水印 自动化办公

前端必会面试题

loveX001

JavaScript

产品的可持续发展

ShineScrum

产品 产品负责人 产品的可持续发展

Vue.$nextTick的原理是什么-vue面试进阶

bb_xiaxia1998

Vue

FL Studio2023最新版本音乐编曲制作软件

茶色酒

FL Studio2023

Shell分支语句

圆弧

分支 条件 shell脚本

问:React的setState为什么是异步的?

beifeng1996

React

零基础入门AI?先来把机器学习捣鼓明白吧

博文视点Broadview

高级前端二面vue面试题(持续更新中)

bb_xiaxia1998

Vue

A-Ops性能火焰图——适用于云原生的全栈持续性能监测工具

openEuler

Linux 运维 操作系统 定位 性能监控

写给go开发者的gRPC教程-拦截器

凉凉的知识库

Go 微服务 gRPC http2

为什么补码是取反加1?

Dinfan

用Docker搭建更酷的本地开发环境

致知Fighting

Java Docker Linux 后端 开发

一个容器,但是一整个k8s集群

newbe36524

C# Docker Kubernetes

三次握手与四次挥的问题,怎么回答?

loveX001

JavaScript

前端react面试题指南

beifeng1996

React

实现一个简单的Database9(译文)

GreatSQL

sqlite greatsql greatsql社区

Vue的computed和watch的区别是什么?

bb_xiaxia1998

Vue

百度前端常考vue面试题(附答案)

bb_xiaxia1998

Vue

KMP算法详解

javaadu

数据结构 字符串 KMP

架构实战营-模块一作业

🐢先生

架构实战营

2023我的前端面试小结

loveX001

JavaScript

老生常谈React的diff算法原理-面试版

beifeng1996

React

vivo 自研Jenkins资源调度系统设计与实践

vivo互联网技术

运维 jenkins 资源调度

被流量和热度裹挟,自媒体行业必须坚守职业道德

石头IT视角

为什么用元空间替代永久代?

王磊

java面试

前端react面试题(边面边更)

beifeng1996

React

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