我有一个使用来自服务器的元数据创建的实体实例:
breeze.NamingConvention.camelCase.setAsDefault();
...
var applicationType = metadataStore.getEntityType('Application');
var application = applicationType.createEntity();
此特定模型中的所有对象都没有循环依赖关系。
在用户对相应对象进行了一些更改后,我需要对该实体执行一些自定义验证,因此我需要将该对象转换回其 JSON 简单形式并将其发送回验证控制器(ASP.NET MVC4) .
问题是如何将实体转换为 JSON,以便:
- 结果对象反映了服务器端使用的命名约定。
- 该对象包含简单的属性,而不是淘汰 observables。
- 并且不包含微风内部使用的任何其他附加属性或功能。
我期待找到类似的东西:
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();