30

次のサービスがあるとします。

myApp.factory('FooService', function () { ...

次に、コントローラーから、次のように言います。

myApp.controller('FooCtrl', ['$scope', 'FooService', function ($scope, FooService) { ...

2 部構成の質問は次のとおりです。

  1. グローバルなアクセシビリティ: 100 個のコントローラーがあり、すべてがサービスにアクセスする必要がある場合、明示的に 100 回注入したくありません。 サービスをグローバルに利用できるようにするにはどうすればよいですか? 現時点で考えられるのは、ルートスコープ内からラップすることだけです。これは目的を無効にします。
  2. ビューからのアクセシビリティ: ビュー内からサービスにアクセスするにはどうすればよいですか? この投稿では、コントローラー内からサービスをラップすることを提案しています。私がその長さに行くなら、ルートスコープに機能を実装するだけでよいのでしょうか?
4

3 に答える 3

39

合理的な解決策を見つけました。これをブートストラップ メソッド (実行) に挿入し、ルート スコープに追加します。そこから、すべてのコントローラーとビューで利用できるようになります。

myApp.run(function ($rootScope, $location, $http, $timeout, FooService) {
    $rootScope.foo = FooService;
    ....

上記の投稿を読み直したところ、「ラップ」とは正確には言われませんでした...単に「抽象的」なので、ポスターはこの同じソリューションを参照していたと思います。

完全を期すために、(1) に対する答えは次のとおりです。

myApp.controller('FooCtrl', ['$scope', function ($scope) { 
    // scope inherits from root scope
    $scope.foo.doSomething();
    ...

(2)への答えは簡単です:

{{doSomething()}}

クリストファーのコメントを追加して、表示されることを確認します。

@rob - ベスト プラクティスによると、ルート スコープではなく、それを使用する必要があるコントローラーにファクトリをインジェクトする必要があります。尋ねられたように、質問 1 は実際にはアンチパターンです。ファクトリが 100 回必要な場合は、100 回注入します。最小化しても余分なコードはほとんどなく、ファクトリが使用されている場所が非常に明確になり、必要なファクトリがすべて関数シグネチャにリストされているため、モックを使用してこれらのコントローラーを簡単に (そしてより明確に) テストできます。— クリストファー WJ ルーバー

于 2013-01-28T21:50:02.837 に答える
6

ビューでサービスに直接アクセスする限り、それは非常に角度がないように見えます。コントローラーのスコープ変数にバインドすることは、サービスを UI で直接使用して職務の分離を維持するよりも優れたソリューションのように思えます。

于 2013-01-28T23:12:12.687 に答える
6

質問#1(グローバルアクセシビリティ)の補足として、ファイルを縮小するときの問題を回避するために(その場合)、次のように記述する必要があることのみを追加します。

this.app.run(["$rootScope", "Foo", function($rootScope, FooService) {
    return $rootScope.fooService = FooService;
  }
]);
于 2013-05-23T16:39:06.773 に答える