【发布时间】:2015-05-04 18:55:16
【问题描述】:
这个问题与我几周前问的基本相同...how to tap into mappingcontext.processAnonType...我将问题标记为错误回答,此后一直无法得到任何跟进。
基本上我想弄清楚的是在微风管道中的一个位置,当对象从服务器结果中具体化时,我可以设置非实体对象的原型......当微风处理来自非实体服务器的结果时,它最终调用了helperMappingContext类的下面的方法……这个方法如下:
function processAnonType(mc, node) {
// node is guaranteed to be an object by this point, i.e. not a scalar
var keyFn = mc.metadataStore.namingConvention.serverPropertyNameToClient;
var result = {};
__objectForEach(node, function (key, value) {
var newKey = keyFn(key);
var nodeContext = { nodeType: "anonProp", propertyName: newKey };
visitNode(value, mc, nodeContext, result, newKey);
});
return result;
}
高于“结果”的值是客户最终从微风中收到的......这是一个完美的地方,我可以做我想做的事,因为我可以访问最终对象(“结果“)和node.$type属性...我基本上想解析node.$type属性以找出非实体对象的原型...不幸的是它没有出现processAnonType是一个拦截点管道...在我问的上一个问题中,我被指示查看自定义 jsonresultsadapter...我这样做了,但我认为它不会工作,因为 jsonresultsadapter 似乎从来没有处于更改“结果”的值(返回的最终对象)......所以即使我实现了自定义 jsonresulsadapter 并返回新节点,上面的“结果”的值仍然是相同的......任何人都可以请提示我?谢谢
编辑#1:我已经尝试过使用自定义 jsonresultsadapter ......但这不适用于我特别想要做的事情,除非我使用的是非常旧版本的微风(不太可能)或遗漏了一些非常明显的东西(更多可能)...在下面我提供了两个sn-ps的微风代码,希望能帮助我解释我的结论...第一个sn-p是mappingcontext的“visitandmerge”方法...在那个方法的底部你'将看到对“jra.visitnode”的调用......这很好......它调用了我的自定义 jra 实现,它在结果中返回一个“node”属性,这样下一行将使用该节点而不是原始节点......到目前为止好……那么最后你会看到对传入我的自定义节点的“processmeta”进行了调用……好吧……但是如果你在我的例子中查看“processmeta”代码,最后一个“else”块结束了被调用并调用“processanontype”......这就是问题所在......此时我的自定义节点被丢弃 f或创建/实例化返回给客户端的最终对象的目的……我知道我的自定义节点将用于为最终对象创建属性,但这不是我所追求的……相反,我需要自己操作最终对象通过设置它的原型……正如我之前提到的,如果您查看“processanontype”方法,它会创建一个新对象(var result = {};)并且该对象返回给客户端,而不是我的自定义节点,它与文档说……请查看我在上一篇文章中留下的所有 cmets……你明白我的问题是什么吗?我可能在这里遗漏了一些非常明显的东西……你能告诉我吗?再次感谢
proto.visitAndMerge = function (nodes, nodeContext) {
var query = this.query;
var jra = this.jsonResultsAdapter;
nodeContext = nodeContext || {};
var that = this;
return __map(nodes, function (node) {
if (query == null && node.entityAspect) {
// don't bother merging a result from a save that was not returned from the server.
if (node.entityAspect.entityState.isDeleted()) {
that.entityManager.detachEntity(node);
} else {
node.entityAspect.acceptChanges();
}
return node;
}
var meta = jra.visitNode(node, that, nodeContext) || {};
node = meta.node || node;
if (query && nodeContext.nodeType === "root" && !meta.entityType) {
meta.entityType = query._getToEntityType && query._getToEntityType(that.metadataStore);
}
return processMeta(that, node, meta);
});
};
function processMeta(mc, node, meta, assignFn) {
// == is deliberate here instead of ===
if (meta.ignore || node == null) {
return null;
} else if (meta.nodeRefId) {
var refValue = resolveEntityRef(mc, meta.nodeRefId);
if (typeof refValue === "function" && assignFn != null) {
mc.deferredFns.push(function () {
assignFn(refValue);
});
return undefined; // deferred and will be set later;
}
return refValue;
} else if (meta.entityType) {
var entityType = meta.entityType;
if (mc.mergeOptions.noTracking) {
node = processNoMerge(mc, entityType, node);
if (entityType.noTrackingFn) {
node = entityType.noTrackingFn(node, entityType);
}
if (meta.nodeId) {
mc.refMap[meta.nodeId] = node;
}
return node;
} else {
if (entityType.isComplexType) {
// because we still need to do serverName to client name processing
return processNoMerge(mc, entityType, node);
} else {
return mergeEntity(mc, node, meta);
}
}
} else {
if (typeof node === 'object' && !__isDate(node)) {
node = processAnonType(mc, node);
}
// updating the refMap for entities is handled by updateEntityRef for entities.
if (meta.nodeId) {
mc.refMap[meta.nodeId] = node;
}
return node;
}
}
【问题讨论】:
标签: breeze