12

その情報に依存する一連のサービスをセットアップする前に、サーバーから何らかの情報 (スキーマ) を取得する必要があります。

私のサーバーは、モデルのさまざまなプロパティを定義するスキーマを提供します。私のAngularコードには、このスキーマを取得するサービスがあります:

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;
});

スキーマに依存する他のサービスに、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

サービス関数は、呼び出すとすぐにその本体を評価するため (関数が行うように)、Promise が得られます。通常、サービスはオブジェクトを返して、コンシューマー (別のサービス、コントローラーなど) が必要なときにそのオブジェクトの関数を呼び出せるようにする必要があります。

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 に答える