1

よし、API に対するローカル開発用のモック サーバーとして使用する $httpBackend をセットアップしようとしています。search と searchMock の 2 つのサービスが別々のモジュールに含まれています。

  • search は、ステージング環境または本番環境で API 動詞を公開する $resource オブジェクトを返し、期待どおりに動作します
  • searchMock は $httpBackend を公開し、これは今度はモック JSON オブジェクトで応答し、それ自体で期待どおりに動作します

別のサービス APIInjector があります。これは、アプリのビルド時に Grunt によって動的に含まれる構成ファイルに基づいて現在の環境が何であるかを判断し、それに応じて search または searchMock を挿入します。

私の問題は、高低の検索からわかる限り、モジュールの run メソッド内で $httpBackend をセットアップする必要があることです。これの問題は、APIInjector の条件付きロジック内に run メソッドを挿入できないことです。

開発環境の条件が満たされている場合に $httpBackend を公開し、それ以外の場合は $resource サービスを公開するにはどうすればよいですか? 呼び出し元のコントローラーや searchService のコードは含めていませんが、必要に応じて説明のために含めることができます。

検索モック:

var searchMockService = angular.module('searchMockService', []);

searchMockService.run([
  '$httpBackend', 
  function($httpBackend) {
    results = [{name: 'John'}, {name: 'Jane'}];
    $httpBackend.whenGET('/search').respond(results);
}]);

API インジェクター:

var APIInjectorService = angular.module('APIInjectorService', [
  'searchService', 
  'searchMockService'
]);

APIInjectorService.factory('APIInjector', [
  '$injector',
  'ENV_CONF',
  function($injector, ENV_CONF) {
    var isDevelopment = ENV_CONF.IS_DEVELOPMENT;

    // Check to see if we're in dev and, if so, inject the local API services
    if (isDevelopment) {
      return {
        Search: // Not sure what to do here to expose searchMock's run method???
      };
    } else {
      return {
        Search: $injector.get('Search') // This returns $resource from the search service, as expected
    };
  }
}]);
4

2 に答える 2

1

この質問に最後のポイントを付けるために、私は最終的にこれをビルド スクリプト (Grunt) に引き出し、上記のアプローチを完全に放棄しました。代わりに、ビルドしたい環境 (開発、ステージング、本番など) をフラグとして Grunt に渡し、ビルド中に適切な API サービスをロードします。

バックエンドレス開発を実装しようとしている他の誰かに役立つことを願っています!

于 2014-08-07T21:42:56.103 に答える