Angularjs Breezejs,如何从shared EntityManager开始获取元数据
我有一个使用Breeze的Angular应用程序,它为我的不同控制器提供了一个共享的EntityManager。可以访问我的一些控制器,而无需执行查询来预填充EntityManager的元数据存储。我发现了一个开始的方向,即在应用程序开始时获取元数据。我的项目基于Angular Breezejs模板,当我尝试执行以下操作时,会出现错误,因为在某些东西使用datacontext之前,承诺没有完全解决Angularjs Breezejs,如何从shared EntityManager开始获取元数据,angularjs,breeze,Angularjs,Breeze,我有一个使用Breeze的Angular应用程序,它为我的不同控制器提供了一个共享的EntityManager。可以访问我的一些控制器,而无需执行查询来预填充EntityManager的元数据存储。我发现了一个开始的方向,即在应用程序开始时获取元数据。我的项目基于Angular Breezejs模板,当我尝试执行以下操作时,会出现错误,因为在某些东西使用datacontext之前,承诺没有完全解决 app.factory('datacontext', ['breeze', 'Q', 'm
app.factory('datacontext',
['breeze', 'Q', 'model', 'logger', '$timeout',
function (breeze, Q, model, logger, $timeout) {
logger.log("creating datacontext");
configureBreeze();
var manager = new breeze.EntityManager("/api/app");
manager.enableSaveQueuing(true);
var datacontext = {
metadataStore: manager.metadataStore,
saveEntity: saveEntity,
getUsers: getUsers,
getUser: getUser,
createUser: createUser,
deleteUser: deleteUser
};
return manager.fetchMetadata()
.then(function () {
model.initialize(datacontext);
return datacontext;
})
.fail(function (error) {
console.log(error);
return error;
});
//Function definitions
在元数据获取完成之前,正确的阻止方法是什么?因为似乎没有必要在每个非查询功能(包括实体创建)结束之前检查元数据是否存在,就像上面链接问题的原始海报一样。我看到了您的问题
当Angular调用工厂函数来创建DataContext服务时,它希望立即(同步)返回一个准备好使用的DataContext
对象。但是您正在返回一个承诺,即在将来某个时间返回该DataContext
。。。而棱角不是为此而生的
不过我喜欢这个主意。您可能想向Angular团队推荐它:-)
所以你在这里尝试的是行不通的。您必须立即返回一个DataContext
。在元数据到达之前,您必须阻止整个UI或阻止依赖元数据的特定功能(例如createUser)。这有点像在使用jQuery操作DOM之前等待DOM稳定下来
这种情况并不具体。在一款淘汰赛应用程序中,你也面临同样的困境。决议也是类似的
首先在DataContext上公开某种“whenReady”钩子。承诺可能是个好主意。大概是这样的:
function (breeze, Q, model, logger, $timeout) {
logger.log("creating datacontext");
...
var readyDeferred = Q.defer(), whenReady = readyDeferred.promise;
var datacontext = {
whenReady: whenReady,
...
};
initializeDatacontext();
return datacontext; // now Angular is happy because it has a datacontext
function initializeDatacontext() {
manager.fetchMetadata()
.then(function () {
readyDeferred.resolve();
// do success stuff;
})
.fail(function (error) {
readyDeferred.reject(error);
// do error stuff;
});
}
//Function definitions
}
现在将作用域的isReady
绑定到HTML,以便获得所需的行为。在datacontext准备就绪之前,您可以使用它来阻止整个UI或只是封闭功能(例如,“创建用户”)
请不要直接使用这个伪代码。用它来激发灵感。这应该更新。fetchMetadata需要一个Dataservice参数,但它不需要。您考虑的是
元数据存储。fetchMetadata
。这是EntityManager.fetchMetadata
。
// somewhere inside your main controller
$scope.isReady = false;
datacontext.whenReady.then(function() {
$scope.isReady = true;
$scope.$apply();
})
.fail(function() { alert("Uh oh!"); });
...