12

在我设置一堆依赖于该信息的服务之前,我需要从服务器获取一些信息(模式)。

我的服务器提供了一个模式来定义模型的各种属性。在我的角度代码中,我有一项服务可以获取此架构:

services.factory('schema', function($q, $http) {
    var deferred = $q.defer();
        $http.get('schema/').then(function(response) {
        schema = // some function of response.data
        deferred.resolve(schema);
    }, function() {
        deferred.reject('There was a problem fetching the schema');
    }); 
        return deferred.promise;
});

我想将模式对象而不是承诺注入到依赖于模式的其他服务中。$routeProvider 允许我们为控制器执行此操作:

app.config(function($routeProvider) {
    $routeProvider.
        when('/', {
            controller: 'SomeCtrl',
            resolve: {
                schema: 'schema'
            },
            ...
        });
});

这让我可以像这样定义 SomeCtrl:

controllers.controller('SomeCtrl', function($scope, schema) {
    // schema is an object
    ...
});

但对于服务,我必须这样做:

services.factory('SomeService', function(schema) {
    // schema is a promise
    schema.then(function(schema) {
        ...
    });
});

有什么办法可以做到这一点吗?

4

2 回答 2

5

你想要的是延迟引导。已经为此目的编写了一个插件 - https://github.com/philippd/angular-deferred-bootstrap

我在 plunkr 创建了一个示例 - http://plnkr.co/edit/VfISHNULXRLe52NeAsn1?p=preview

*您必须用延迟引导替换现有的 ng-app

代码片段 -

angular.element(document).ready(function() {
    deferredBootstrapper.bootstrap({
        element: document.body,
        module: 'plunker',
        resolve: {
            schema: ['$http',
                function($http) {
                    return $http.get('schema.json');
                }
            ]
        }
    });
});

然后,您可以在控制器、服务或工厂中使用模式,就像路由解析一样。

工厂示例代码

app.factory('SomeService', function(schema){
    return {
        getTitle: function() {
            return schema.title;
        }
    }
});
于 2014-07-25T04:44:17.750 回答
-1

你得到了一个承诺,因为你的服务函数在你调用它时会立即评估它的主体(就像函数一样)。通常,服务应该返回一个对象,以便消费者(另一个服务、控制器等)可以在需要时调用该对象上的函数。

services.factory('schema', function($q, $http) {
return {
  get: function() {
    var deferred = $q.defer();
    $http.get('schema/').then(function(response) {
      schema = // some function of response.data
      deferred.resolve(schema);
    }, function() {
      deferred.reject('There was a problem fetching the schema');
    });
    return deferred.promise;
  }
}

});

于 2013-09-27T16:10:20.393 回答