【发布时间】:2014-06-17 09:47:31
【问题描述】:
如何在 ViewModel 中为轻量级实体添加可淘汰的属性 - IsSelected() 以协助视图显示?
IsSelected 不是实体中的字段,也不应该是,但是我需要将实体标记为已选择用于 UI DOM 操作(添加/删除 css 类等)
IsSelected 确实是一个 UI 的东西,但这就是 MVVM 模式对我来说变得模糊的地方。
【问题讨论】:
-
纯粹主义者会说在模型实体中添加
isSelected是错误的,因为这是 UI 事实,而不是业务模型事实。当您在两个屏幕上显示实体并且应该在一个屏幕上而不是另一个屏幕上选择它时,它可能会在稍后咬您。纯粹主义者会说您应该创建一个“ItemViewModel”,其中包含实体和有关它的 UI 事实。你可能会回答,“是的......你是对的......但现在我要按照@Nathan所说的去做;如果我必须要在以后“解决这个问题”并不难...... . 我可能不会。” -
@Ward -isSelected 似乎(对我来说)像只属于 UI 中的东西,由视图维护,但我不能这样做,因为这些项目是从淘汰赛 foreach 循环中填充的,视图由 $.ajax 调用加载,并绑定在成功回调上,因此在视图准备就绪时,数据绑定尚未发生。因此,如果我只是在视图模型中执行此操作(而不是添加到模型中),我唯一的想法是维护所选项目的某种辅助哈希表,因此 Nathan 的解决方案要容易得多!
-
@nathan 的回答显然更容易。对于傻笑,您可以创建一个“ItemViewModel”,它是您实体的包装器。它可能是两个属性的东西:
{item: ko.observable(the-breeze-entity), isSelected: ko.observable(false)};你可能不需要让item是可观察的。无论如何,在视图中,您绑定到这些家伙的 KO 数组。通过它绑定以获取嵌套的实体属性,例如“...item().firstName”。哎呀......但它的工作原理。或者像我一样与杂质一起生活。
标签: knockout.js breeze