【发布时间】:2026-02-08 14:10:02
【问题描述】:
我使用 KnockoutJS 已经有一段时间了,主要用于中小型项目。但是,我现在正在处理一个非常大的项目,该项目对同一数据有许多不同的视图。例如,产品可以显示给客户,允许他们将产品添加到他们的购物车,也可以显示给管理员,允许他们编辑产品名称、价格和可用库存。我希望能够在这两种情况下使用相同的模型,但事实证明用 KnockoutJS 设计解决方案很困难。具体来说,我有两个问题:
我希望能够重复使用某些“查看”功能而无需重复自己。例如,在产品的客户视图和管理员视图中,单击产品缩略图会全屏显示产品图像。我可以将绑定信息移动到模型本身,而不是每个视图都包含相同的详细绑定代码(例如,两个视图中的 <img data-bind="event:{click:function codeToZoom(){}}"/>)。所以上面变成了<img data-bind="event:imageEvents()"/>。但是,执行上述操作会迫使我在模型中包含响应用户输入的代码,这违反了单一职责原则——例如,模型对业务逻辑负责,而不是响应用户输入。如果我决定让管理员单击缩略图以打开“上传新图像”对话框,那么我需要实现 imageEventsForAdministrator() 函数。
我问过人们如何处理上述问题,他们的回答是“编写两个不同的模型”。这听起来不错,直到您意识到产品具有大量嵌入式逻辑,并且编写两个不同的模型会迫使您复制该逻辑。所以:
根据 KnockoutJS,将业务逻辑与响应事件/用户输入分开的推荐方法是什么?
【问题讨论】:
-
你有没有考虑过使用继承来处理重复的逻辑?
-
淘汰组件有一个视图模型,可以负责处理视图逻辑。业务逻辑可以封装在领域模型中。
标签: javascript html web-applications mvvm knockout.js