我有以下方法:
function _getById(entityName, id, navigationProperty) {
var self = this;
var manager = self.manager;
if (manager.metadataStore.isEmpty()) {
return manager.fetchMetadata().then(function () {
var entityType = manager.metadataStore.getEntityType(entityName);
var entityKey = new EntityKey(entityType, id);
return EntityQuery.fromEntityKey(entityKey)
.expand(navigationProperty)
.using(manager)
.execute()
.to$q(querySucceeded);
});
}
else {
var entityType = manager.metadataStore.getEntityType(entityName);
var entityKey = new EntityKey(entityType, id);
return EntityQuery.fromEntityKey(entityKey)
.expand(navigationProperty)
.using(manager)
.execute()
.to$q(querySucceeded);
}
function querySucceeded(data) {
return data;
}
}
如果我通过应用程序导航到页面,这可以正常工作,但是,如果我直接加载该页面,我会收到以下错误:
Unable to locate a 'Type' by the name: 'Customer'. Be sure to execute a query
or call fetchMetadata first.
单步执行代码,似乎转到else
语句的if
部分,暗示元数据存储不为空,但从错误中看,它似乎是?我在这做错了什么?
我做了一些改动,但仍然得到了相同的结果:
function _getById(entityName, id) {
var self = this;
var manager = self.manager;
if (!manager.metadataStore.hasMetadataFor('breeze/ax')) {
return manager.fetchMetadata()
.then(_getEntityById(manager, entityName, id));
}
else {
return $q.when(_getEntityById(manager, entityName, id));
}
}
function _getEntityById(manager, entityName) {
var entityType = manager.metadataStore.getEntityType(entityName);
var entityKey = new EntityKey(entityType, id);
return EntityQuery.fromEntityKey(entityKey)
.using(manager)
.execute()
.to$q(querySucceeded);
function querySucceeded(data) {
var entity = data.results[0];
return entity;
}
}
答案 0 :(得分:0)
DurandalJS
)
我所做的是在激活路由器之前调用shell视图中的方法fetchMetadata()
因此,在shell视图的activate方法中,您的代码可能如下所示:
function activate() {
return manager.fetchMetadata()
.then(boot)
.fail(failedInitialization);
}
function boot() {
return router.map(routes) // routes is our array of routes
.buildNavigationModel()
.activate();
}
在这种情况下,您不必检查元数据的状态,因为在加载应用程序之前它将被调用,MetadataStore.hasMetadataFor
将始终返回false。