我有一个SPA应用程序(durandaljs),我有一个特定的路由,我映射我想要获取的实体的"id".
模板是"/#/ todoDetail /:id".
例如,"/#/ todoDetail/232"或"/#/ todoDetail/19".
在viewmodel的激活功能上,我得到了路由信息,所以我可以获取id.然后我创建了一个breezejs EntityManager的新实例来获取具有给定id的实体.
问题是当我调用manager.fetchEntityByKey("Todos",id)时,EntityManager还没有来自服务器的元数据,所以它抛出异常"无法通过名称找到'Type':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);
}
};
Run Code Online (Sandbox Code Playgroud)