gpt4 book ai didi

breeze - 如何检测实体 EntityState 的更改?

转载 作者:行者123 更新时间:2023-12-04 07:05:00 25 4
gpt4 key购买 nike

我想在客户列表的每一行上放置一个“删除”按钮和一个“取消”按钮。当客户为“未更改”时,“取消”按钮被禁用。但是,当客户转换到更改状态(“已添加”、“已修改”、“已删除”)时,我想启用“取消”按钮,以便用户可以在保存之前撤消更改(无论它们是什么)。

我几乎可以通过订阅 customer.entityAspect.propertyChanged 来做到这一点.属性变化预示着EntityState 的潜在变化。 .我可以订阅该事件并让我的处理程序更新 isChanged可观察到我已添加到我的客户实体中。然后我将“取消”按钮启用绑定(bind)到 isChanged我可以走了。

但是 propertyChanged仅在数据属性更改时引发事件,例如 customer.Name("New Co."); .当用户单击“删除”按钮时不会引发它。 “删除”触发器customer.entityAspect.setDelete();不涉及数据属性;它只是改变了客户的EntityState .

(1)为什么客户的EntityState 没有更改?提高propertyChanged (2) 我怎样才能听到 EntityState 的变化?所以我可以控制“取消”按钮?

P.S.:我正在使用 Knockout。

P.P.S:这个问题的灵感来自之前的 SO question "entityAspect.setDeleted doesn't fire the subscribed propertyChanged event" .

最佳答案

你是对的,Breeze 没有提出 propertyChangedEntityState变化。也许应该。我们会考虑的。

Breeze 也没有单独的事件 关于实体 - 没有 entityStateChanged事件 - 在 EntityState 时通知您变化。我们已经考虑过好几次了。我们一直在谈论自己。

有一个比专用 entityStateChanged 性能更好的完美解决方案事件。现在你必须自己编码。

诀窍是听EntityManager ,而不是实体。您可以在 DocCode "Teach Tests" 中找到此解决方案的一种变体。样本;在 entityTest.js 模块中查找“可以通过 entityManager.entityChanged 控制自定义 ko entityState 属性”。

我会调整它以适合您的示例。它的本质如下:

  • 订阅entityManager.entityChanged事件;当它被提出时原因是实体的 EntityState更改,您更新该实体的 isChanged boolean KO observable(如果该属性存在)。
  • 添加 isChanged可观察到应该以这种方式观察的实体类型。

  • 这是第 1 步的示例:监听状态变化

    //订阅处理程序以观察 EntityState 的变化
    addEntityStateChangeTracking(经理);

    功能 addEntityStateChangeTracking(entityManager) {

    if (entityManager._entityStateChangeTrackingToken) { 返回; }//已经在跟踪它

    //使用 token 记住更改跟踪订阅;
    //将来可能会取消订阅该 token
    entityManager._entityStateChangeTrackingToken =
    entityManager.entityChanged.subscribe(entityChanged);

    var entityStateChangeAction = Breeze .EntityAction.EntityStateChange;

    功能实体改变(changeArgs){
    if (changeArgs.entityAction === entityStateChangeAction) {
    var 实体 = changeArgs.entity;
    if (entity && entity.isChanged) {//实体有 observable
    var isUnchanged = entity.entityAspect.entityState.isUnchanged();
    entity.isChanged(!isUnchanged);
    }
    }
    }
    }

    让我们谈谈第 2 步:添加 isChanged可观察到的类型。您似乎已经解决了那个问题,但我不确定如何解决。将它添加到类型中的最佳位置可能是在 type's initializer 中。因此,您可以确定该属性将在那里,无论实体是由查询创建还是具体化。这是一个例子:

    var store = manager.metadataStore;

    功能客户初始化(实体){
    var isUnchanged = entity.entityAspect.entityState.isUnchanged();
    entity.isChanged = ko.observable(!isUnchanged);
    }

    store.registerEntityTypeCtor('Customer', null, customerInit);

    这一切似乎需要做很多工作。如果 Breeze 提出 propertyChanged 会更容易。 EntityState 时的事件变化。我们将给予更多考虑……可能会有一些很好的反驳论点。同时,我认为你在这里看到的是最好的方法。

    关于breeze - 如何检测实体 EntityState 的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14297908/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com