我有一个 SPA 应用程序(durandaljs),并且我有一个特定的路线,我在其中映射我想要获取的实体的“id”。
模板是“/#/todoDetail/:id”。
例如,“/#/todoDetail/232”或“/#/todoDetail/19”。
在 viewmodel 的激活功能上,我得到了路线信息,所以我可以获取 id。然后我创建一个新的微风 EntityManager 实例来获取具有给定 id 的实体。
问题是当我调用 manager.fetchEntityByKey("Todos", id) 时,EntityManager 还没有来自服务器的元数据,所以它抛出异常“无法通过名称找到‘类型’:Todos”。
仅当我在调用 fetchEntityByKey 之前首先对存储 (manager.executeQuery) 执行查询时,它才有效。
这是预期的行为还是错误?有没有办法在 EntityManager 的实例化过程中自动修改元数据?
注意:我认为在我的情况下很难使用共享的 EntityManager,因为我希望允许用户直接在浏览器上键入路由。
编辑:作为临时解决方法,我正在这样做:
BreezeService.prototype.get = function (id, callback) {
var self = this;
function queryFailed(error) {
app.showMessage(error.message);
callback({});
}
/* first checking if metadatastore was already loaded */
if (self.manager.metadataStore.isEmpty()) {
return self.manager.fetchMetadata()
.then(function (rawMetadata) {
return executeQuery();
}).fail(queryFailed);
} else {
return executeQuery();
}
/* Now I can fetch */
function executeQuery() {
return self.manager.fetchEntityByKey(self.entityType, id, true)
.then(callback)
.fail(queryFailed);
}
};