0

0

动态创建 Knockout.js 可观察对象并实现 HTML 中的条件渲染

聖光之護

聖光之護

发布时间:2026-01-14 11:36:29

|

342人浏览过

|

来源于php中文网

原创

动态创建 Knockout.js 可观察对象并实现 HTML 中的条件渲染

本文讲解如何基于数据项动态生成独立的 knockout.js `observable`,避免多个 dom 元素共用同一观测值导致状态混乱,并通过 `purecomputed` 实时统计选中数量、动态显示提示信息。

在 Knockout.js 开发中,一个常见误区是试图用全局或共享的 observable(如 vm.observables.totalSelected)来响应多个独立 UI 元素的状态变化——这会导致逻辑耦合、更新不可控,且无法精准追踪每个元素的选中状态。正确做法是:为每条数据项绑定专属的 observable,再通过计算属性(pureComputed)聚合状态

以下是一个完整、可运行的实践方案:

GAIPPT
GAIPPT

AI PPT制作和美化神器

下载

✅ 正确结构:为每项数据创建独立 observable

var externalData = [
  { mandatory: false, dynamicid: 1 },
  { mandatory: false, dynamicid: 2 },
  { mandatory: 1,     dynamicid: 3 }, // 示例中视为必选(但不影响选中逻辑)
  { mandatory: false, dynamicid: 4 }
];

function ViewModel() {
  var self = this;

  // 存储带状态的数据集合(每个 item 拥有独立 selected observable)
  self.data = ko.observableArray([]);

  // 【关键】纯计算属性:实时统计所有被选中的项数
  self.totalSelected = ko.pureComputed(function() {
    return self.data().filter(item => item.selected()).length;
  });

  // 【增强体验】动态提示文本(支持响应式更新)
  self.selectedText = ko.pureComputed(function() {
    const count = self.totalSelected();
    return count > 2 
      ? `You have selected ${count} Observation areas. Please restrict to only 2.` 
      : `You have selected ${count} Observation area${count !== 1 ? 's' : ''}.`;
  });

  // 映射原始数据 → 带 knockout 状态的对象
  var mappedData = externalData.map(function(item) {
    return {
      mandatory: item.mandatory,
      dynamicid: item.dynamicid,
      selected: ko.observable(false), // ✅ 每个 item 独立 observable
      // 可选:用于 CSS 控制(如高亮必选项)
      mandatoryStatus: item.mandatory ? 'mandatory' : ''
    };
  });

  self.data(mappedData);
}

ko.applyBindings(new ViewModel());

✅ HTML 模板:使用 foreach + as 绑定,精准作用于每一项





⚠️ 注意事项与最佳实践

  • 不要在视图中操作 DOM 查询(如 $('#id'+dynamicid)):这违背 MVVM 原则,破坏响应式流,且易引发竞态问题;
  • 避免手动维护计数器(如 DataImprove++):应交由 pureComputed 自动推导,保证状态单一可信源(Single Source of Truth);
  • pureComputed 优于 computed:当依赖项仅为 observable(无副作用),pureComputed 更高效,且自动管理订阅生命周期;
  • ID 属性建议语义化命名:如 id="chk-1" 而非 id="id1",提升可读性与调试便利性;
  • 限制逻辑可进一步封装:例如添加 item.isOverLimit 计算属性,或在 selected.subscribe() 中拦截超限操作。

✅ 效果总结

  • ✅ 每个复选框拥有独立 selected 状态,互不干扰;
  • ✅ totalSelected() 实时反映真实选中数;
  • ✅ 提示文案随数量动态切换,超限时显红警示;
  • ✅ 完全声明式绑定,无 jQuery 手动遍历,代码可测试、易维护。

通过该模式,你不仅能解决“多个 div 共享同一 observable”的问题,更能构建出可扩展、响应及时、符合 Knockout 设计哲学的数据驱动界面。

相关专题

更多
jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

150

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

393

2023.11.10

jQuery hover()方法的使用
jQuery hover()方法的使用

hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

495

2023.12.04

jquery实现分页方法
jquery实现分页方法

在jQuery中实现分页可以使用插件或者自定义实现。想了解更多jquery分页的相关内容,可以阅读本专题下面的文章。

179

2023.12.06

jquery中隐藏元素是什么
jquery中隐藏元素是什么

jquery中隐藏元素是非常重要的一个概念,在使用jquery隐藏元素之前,需要先了解css样式中关于元素隐藏的属性,比如display、visibility、opacity等属性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

118

2024.02.23

jquery中什么是高亮显示
jquery中什么是高亮显示

jquery中高亮显示是指对页面搜索关键词时进行高亮显示,其实现办法:1、先获取要高亮显示的行,获取搜索的内容,再遍历整行内容,最后添加高亮颜色;2、使用“jquery highlight”高亮插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

172

2024.02.23

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

2

2026.01.13

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

1

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

CSS教程
CSS教程

共754课时 | 18.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号