2

サーバーからのメタデータを使用して作成されたエンティティ インスタンスがあります。

breeze.NamingConvention.camelCase.setAsDefault();

...

var applicationType = metadataStore.getEntityType('Application');
var application = applicationType.createEntity();

この特定のモデルのどのオブジェクトにも循環依存関係はありません。

ユーザーが対応するオブジェクトに変更を加えた後、そのエンティティに対してカスタム検証を実行する必要があるため、そのオブジェクトを単純な JSON 形式に変換し、検証コントローラー (ASP.NET MVC4) に送り返す必要があります。 .

問題は、次のようにエンティティを JSON に変換する方法です。

  1. 結果のオブジェクトは、サーバー側で使用される命名規則を反映しています。
  2. オブジェクトには単純なプロパティが含まれており、ノックアウト オブザーバブルは含まれていません。
  3. また、そよ風の内部で使用されるその他の追加のプロパティや関数は含まれません。

私は次のようなものを見つけることを期待していました:

var json = application.toJS();

しかし、そのような方法は存在しません。ko.toJS(application) を使用しても、(1)、(2)、(3)が満たされていないため機能しません。

これは簡単にできるはずですが、ドキュメントに関連するものは何も見つかりません。

更新: 恐ろしいハックを許してくれますが、私は急いでいるので、一時的に問題を解決したunwrapEntitiesのはentityManager. また、関数定義を少し変更しました (煩わしいものを除外するためだけにentityAspect):

function unwrapEntities(entities, metadataStore, includeEntityAspect) {
    var rawEntities = entities.map(function(e) {
        var rawEntity = unwrapInstance(e);

        if (includeEntityAspect !== undefined && includeEntityAspect === false) {
            return rawEntity;
        }
        ...
    });
}

またentityManager、サービスで をいつでも利用できるので、型の定義を拡張して、次のようなことを行うことができました。

function createApplicant(initialValues) {
    var applicant = applicantType.createEntity(initialValues);

    applicant.toJS = function () {
        var unwrappedEntities = entityManager.unwrapEntities([applicant], entityManager.metadataStore, false);
        return unwrappedEntities[0];
    };

    return applicant;
}

そして、それはまさに私が必要とするものです:

var json = application.toJS();
4

2 に答える 2