我有一个 SPA 应用程序 (durandaljs),并且有一条特定的路线,可以在其中映射我想要获取的实体的“id”。
模板是“/#/todoDetail/:id”。
例如,“/#/todoDetail/232”或“/#/todoDetail/19”。
在 viewmodel 的激活函数中,我获取了路线信息,以便获取 id。然后,我创建一个新的 tweetjs EntityManager 实例来获取具有给定 id 的实体。
问题是当我调用 manager.fetchEntityByKey("Todos", id) 时,EntityManager 还没有来自服务器的元数据,因此它抛出异常“无法通过名称找到“类型”:Todos”。
仅当我在调用 fetchEntityByKey 之前首先对存储执行查询 (manager.executeQuery) 时,它才有效。
这是预期行为还是错误?有没有办法在 EntityManager 实例化期间自动获取元数据?
注意:我相信在我的例子中很难使用共享的EntityManager,因为我想允许用户直接在浏览器上键入路线。
EDIT:作为临时解决方法,我正在这样做:
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);
}
};