propertyChanged
変更時に Breeze が発生しないことは正しいですEntityState
。多分それはすべきです。検討いたします。
また、Breezeにはエンティティに別のイベント (イベントなし) がなくentityStateChanged
、変更時に通知されますEntityState
。私たちはそれを何度か検討しました。私たちはそれについて自分自身を話し続けています。
専用のentityStateChanged
イベントよりも優れたパフォーマンスを発揮する、完全に優れたソリューションがあります。現時点では、自分でコーディングする必要があります。
秘訣はEntityManager
、エンティティではなく、 をリッスンすることです。DocCode の「Teach Tests」サンプルには、このソリューションのバリエーションが 1 つあります。entityTest.jsモジュールで " can control custom ko entityState property via entityManager.entityChanged " を探します。
あなたの例に合うように微調整します。その本質は次のとおりです。
entityManager.entityChanged
イベントにサブスクライブします。それが発生し、その原因がエンティティのEntityState
変更である場合、そのエンティティのisChanged
ブール KO オブザーバブルを更新します (そのプロパティが存在する場合)。
isChanged
この方法で監視する必要があるエンティティ タイプにオブザーバブルを追加します。
ステップ 1 の例を次に示します: 状態の変化をリッスンする
// EntityState の変更を監視するハンドラでサブスクライブします
addEntityStateChangeTracking(マネージャー);
関数 addEntityStateChangeTracking(entityManager) {
if (entityManager._entityStateChangeTrackingToken) { return; } // すでに追跡中
// トークンを使用して変更追跡サブスクリプションを記憶します。
// 将来、そのトークンで登録を解除する可能性があります
entityManager._entityStateChangeTrackingToken =
entityManager.entityChanged.subscribe(entityChanged);
var entityStateChangeAction = Breeze.EntityAction.EntityStateChange;
関数entityChanged(changeArgs) {
if (changeArgs.entityAction === entityStateChangeAction) {
var エンティティ = changeArgs.entity;
if (entity && entity.isChanged) { // エンティティにはオブザーバブルがあります
var isUnchanged = entity.entityAspect.entityState.isUnchanged();
entity.isChanged(!isUnchanged);
}
}
}
}
ステップ 2 について話しましょう:isChanged
オブザーバブルを型に追加します。あなたはそれに取り組んでいるようですが、どうすればよいかわかりません。おそらく、型に追加するのに最適な場所は型の初期化子であるため、エンティティが作成されたか、クエリによって具体化されたかに関係なく、プロパティがそこにあることを確認できます。次に例を示します。
var ストア = manager.metadataStore;
関数 customerInit(エンティティ) {
var isUnchanged = entity.entityAspect.entityState.isUnchanged();
entity.isChanged = ko.observable(!isUnchanged);
}
store.registerEntityTypeCtor('Customer', null, customerInit);
This all seems like a lot of work. It would be easier if Breeze raised the propertyChanged
event when the EntityState
changes. We'll give that more consideration ... there may be some good counter arguments. Meanwhile, I think what you see here is the best approach.