Angularjs Breezejs,如何从shared EntityManager开始获取元数据

Angularjs Breezejs,如何从shared EntityManager开始获取元数据,angularjs,breeze,Angularjs,Breeze,我有一个使用Breeze的Angular应用程序,它为我的不同控制器提供了一个共享的EntityManager。可以访问我的一些控制器,而无需执行查询来预填充EntityManager的元数据存储。我发现了一个开始的方向,即在应用程序开始时获取元数据。我的项目基于Angular Breezejs模板,当我尝试执行以下操作时,会出现错误,因为在某些东西使用datacontext之前,承诺没有完全解决 app.factory('datacontext', ['breeze', 'Q', 'm

我有一个使用Breeze的Angular应用程序,它为我的不同控制器提供了一个共享的EntityManager。可以访问我的一些控制器,而无需执行查询来预填充EntityManager的元数据存储。我发现了一个开始的方向,即在应用程序开始时获取元数据。我的项目基于Angular Breezejs模板,当我尝试执行以下操作时,会出现错误,因为在某些东西使用datacontext之前,承诺没有完全解决

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!"); }); ...