9

カスタム フィルターと、Isolate スコープを持つディレクティブを定義しましたが、ディレクティブ モジュールに注入していない (アプリケーション モジュールに注入した) のに、ディレクティブがカスタム フィルターにアクセスできる理由がわかりません。 -- 例を参照)。

フィルターのスコープ規則は、他のスコープ プロパティとは異なりますか? それとも、フィルターについて考えるときにこれを使用するのは間違ったフレームワークですか?

ここでの作業例: http://jsbin.com/IRogUxA/6/edit?html,js,output

前もって感謝します!

4

2 に答える 2

10

これは、ディレクティブがexampleAppモジュールによって作成されたルート スコープの子であるためです。、、およびモジュールはservices、子からルート スコープまでのツリーのプロトタイプの継承を提供するために注入されます。将来のある時点で、によって作成されたルートスコープがモジュールを除外する場合に備えて、フィルターがディレクティブにアクセスできることに依存するのは危険です。controllersdirectivesexampleApptoDatelinkBoxexampleAppservices

Erstad Stephen が回答で書いたことは部分的に正しいですが、 $injector ではフィルター名にFilter. $filterProvider docsで詳しく説明されています。

次のコードが機能します。

//CORE MODULE
angular.module('exampleApp',['controllers','directives']);

angular.module('controllers',[]).controller('app_ctrl',['$scope',function($scope){
  $scope.dateVal = 20131010;
}]);

angular.module('services',[]).filter('toDate',[function(){
  function func(ymd){
    ymd = ymd + "";
    var y = ymd.substring(0,4);
    var m = ymd.substring(4,6);
    var d = ymd.substring(6);
    return (+m) + "/" + (+d) + "/" + y;
  }
  return func;
}]);

//DIRECTIVE
angular.module('directives',['services']).directive('linkBox', ['toDateFilter', function(toDate){
  var dir = {
    transclude:false,
    scope:{isolateVar:'@linkBox'},
    replace:true,
    template:'<p>Filtered value: {{isolateVar | toDate}}</p>',
    link: function lfn(scope, instance, attr){
      var a = angular.element(instance); 
      a.text(scope.isolateVar.name);
      console.log(scope);
    } //end link function
  }; //end dir object
  return dir;
}]);

これが実際の JSBin です: http://jsbin.com/ICUjuri/2/edit

于 2013-10-09T18:01:54.427 に答える
2

これは、フィルターが依存関係であるため、「exampleApp」モジュールで使用できるためです。

Adam Thomas はそれについては正しいですが、カスタム ディレクティブ、サービス、および他のカスタム アイテムのフィルターに依存するのは一般的なシナリオです。DI アサーションで物事を明示的にしたい。これにより、カスタム ディレクティブを使用する場合ではなく、インジェクション レベルで問題が発生します。

//DIRECTIVE
angular.module('directives',['services']).directive('linkBox', ['toDate',function(toDate){
  ...
}]);

これにより、ディレクティブを使用する必要があることを明確にすることができ、簡単に見逃すことはありません。これには、「toDate」の宣言方法を微調整する必要がある場合があります。

于 2013-10-09T18:15:16.740 に答える