当EntityState 发生变化时,Breeze 不会引发propertyChanged,这是正确的。也许应该。我们会考虑的。
Breeze 也没有单独的事件实体 - 没有entityStateChanged 事件 - 在EntityState 更改时通知您。我们已经考虑过好几次了。我们一直在谈论自己。
有一个比专门的entityStateChanged 事件执行得更好的完美解决方案。现在你必须自己编写代码。
诀窍是听EntityManager,而不是实体。您将在DocCode "Teach Tests" 示例中找到此解决方案的一个变体;在 entityTest.js 模块中查找“can control custom ko entityState property via entityManager.entityChanged”。
我会调整它以适合您的示例。其实质如下:
订阅entityManager.entityChanged事件;当它被提出并且原因是实体的EntityState 更改时,您更新该实体的isChanged boolean KO observable(如果该属性存在)。
将isChanged 可观察对象添加到应该以这种方式观察的实体类型。
这是第 1 步的示例:监听状态变化
// 订阅处理程序以观察 EntityState 的变化
addEntityStateChangeTracking(经理);
功能 addEntityStateChangeTracking(entityManager) {
if (entityManager._entityStateChangeTrackingToken) { 返回; } // 已经在跟踪它
// 使用令牌记住更改跟踪订阅;
// 将来可能会取消订阅该令牌
entityManager._entityStateChangeTrackingToken =
entityManager.entityChanged.subscribe(entityChanged);
var entityStateChangeAction = 微风.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 在 EntityState 更改时引发 propertyChanged 事件会更容易。我们将给予更多考虑……可能会有一些很好的反驳论点。同时,我认为您在这里看到的是最好的方法。