0

自己完結型に設計された角度モジュールがあります。消費するアプリは、url パラメーターを使用してディレクティブを追加でき、ウィジェットとやり取りするときにその URL を全体的なデータ ソースとして使用します。これには、$http を使用してデータをロードする一般的な LoadService があり、特定の JSON 形式でウィジェットを実行する必要があります。

現在、誰かがカスタム ロード サービスを作成してモジュールに注入できるようにリファクタリングしようとしていますが、注入されていない場合はデフォルトのデータ ロードが使用されます。したがって、モジュールを消費しているアプリによって定義されている場合、 CustomLoadService が注入される方法を作成する方法を見つけようとしています。ただし、カスタム サービスが定義されていない場合でもエラーになることはなく、デフォルト サービスを使用する必要があります。

を調べていて、$injector.getその可能性があると考えていましたが$injector、コントローラに を挿入するのに問題があります。$location注射するだけなら簡単だと思いました。何かのようなもの...

angular
  .module('Widget')
  .controller('WidgetController',[
    '$scope', 
    'WidgetLoadService', 
    '$injector', 
    WidgetController
  ]);

この方法はうまくいかないようなので、疑問に思っています...この問題を解決するための最も「角度のある方法」は何ですか。$injector をどのように使用すればよいですか。

4

1 に答える 1

0

You can use $injector:

app.controller('MainCtrl', function($scope, $injector) {
  $scope.name = $injector.get('test').name;
}).factory('test', function() { return {name: 'world'} });

So you may have something like this as a result:

app.controller('MainCtrl', function($scope, shareService) {
  $scope.name = shareService.getData();

  shareService.setDataService('dataService2');

  $scope.name = shareService.getData();
})

.factory('shareService', function($injector) { 
  var dataServiceName;

  return {
    setDataService: function(name) {
      dataServiceName = name;
    },
    getData: function(name) {
      return $injector.get(dataServiceName || 'dataService').data;
    }
  } 

})


.factory('dataService', function() { return {data: 'world'} })

.factory('dataService2', function() { return {data: 'world 2'} });
于 2016-08-30T17:18:51.583 に答える