【问题标题】:How do I add a property to a breeze entity in the ViewModel, to assist with View display?如何将属性添加到 ViewModel 中的微风实体,以协助 View 显示?
【发布时间】: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


【解决方案1】:

您可以使用metadataStore.registerEntityTypeCtor 方法扩展您的微风实体

在我的一些项目中,我有一个单独的函数来扩展每个实体。

所以你最终会得到这样的东西。

function extendProduct(metadataStore) {
    var ctor = function () {

    };
    var initialiser = function (entity) {
        entity.isSelected= ko.observable(false);

        return entity;
    };

    metadataStore.registerEntityTypeCtor('Product', ctor, initialiser);
}

我通常使用初始化程序,因为它是在微风通过添加其所有附加属性等使实体水化后调用的。

我通常远离构造方法,因为它被称为微风水化实体的第一步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2011-09-14
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多