【发布时间】:2013-04-18 14:58:01
【问题描述】:
我有一个使用来自服务器的元数据创建的实体实例:
breeze.NamingConvention.camelCase.setAsDefault();
...
var applicationType = metadataStore.getEntityType('Application');
var application = applicationType.createEntity();
此特定模型中的所有对象都没有循环依赖关系。
在用户对相应对象进行了一些更改后,我需要对该实体执行一些自定义验证,因此我需要将该对象转换回其 JSON 简单形式并将其发送回验证控制器 (ASP. NET MVC4)。
问题是如何将实体转换为 JSON,这样:
- 生成的对象反映了服务器端使用的命名约定。
- 该对象包含简单的属性,而不是剔除的可观察对象。
- 并且不包含微风内部使用的任何其他附加属性或函数。
我期待找到类似的东西:
var json = application.toJS();
但是这种方法不存在。使用 ko.toJS(application) 也不起作用,因为 (1)、(2) 和 (3) 没有实现。
我确信这应该很容易做到,但我什至在文档中找不到任何与远程相关的内容。
更新:你会原谅我的可怕黑客攻击,但因为我很着急我所做的暂时解决了我的问题只是暴露了entityManager 的unwrapEntities 内部函数。我还稍微更改了函数定义(只是为了排除烦人的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();
【问题讨论】:
标签: asp.net-mvc knockout.js breeze