2013-04-17 12 views
32

私にはさらに別の問題があります。今度は、ディレクティブのコントローラに渡された$ scopeサービスが原因です。下記のコードを参照してください:AngularJS:指令の縮小問題

angular.module('person.directives'). 
directive("person", ['$dialog', function($dialog) { 
return { 
    restrict: "E", 
    templateUrl: "person/views/person.html", 
    replace: true, 
    scope: { 
     myPerson: '=' 
    },  
    controller: function ($scope) 
    {     
     $scope.test = 3;     
    } 
} 
}]); 

私がコントローラの部分をコメントアウトすると、正常に動作します。

ご覧のとおり、ディレクティブの配列宣言が使用されているため、$ダイアログサービスは縮小後でもAngularに認識されています。しかし、私はコントローラの$ scopeサービスのためにそれをどうするのですか?

答えて

73

あなたは次のようにコントローラを宣言する必要があります。ここに

controller: ['$scope', function ($scope) 
    {     
     $scope.test = 3;     
    }] 

全例:

angular.module('person.directives'). 
directive("person", ['$dialog', function($dialog) { 
return { 
    restrict: "E", 
    templateUrl: "person/views/person.html", 
    replace: true, 
    scope: { 
     myPerson: '=' 
    },  
    controller: ['$scope', function ($scope) 
    {     
     $scope.test = 3;     
    }] 
} 
}]); 

@Samが提供するソリューションは、に働くだろうが、それは全体にディレクティブのコントローラーをさらす意味します不要なアプリケーション。

+0

それは私によって提供される解決策です:) Sam = OP ;-)しかし、私はコントローラ全体を、ディレクティブが属するモジュール全体に公開しているわけではありません。私はあなたのアプローチが好きです、私はそれのために行くでしょう。 – Sam

+0

これを実際にAngularJSモジュールに公開すると、AngularJSモジュールがアクセスすることになります。これはアプリケーション全体に公開することで意味しています。 –

+0

AngularJSモジュールは、依存している場合にのみperson.controllersモジュールにアクセスできます。彼らがその依存関係を持たない場合、その依存関係にアクセスするべきではありません。それじゃない? – Sam

1

[OK]を、私は別のファイルにコントローラを作成することになった:

angular.module('person.controllers').controller('personCtrl', ['$scope', function ($scope) { 
$scope.test = 3; 
}]); 

、その後ディレクティブで、私は名前でコントローラを割り当てる:

controller: 'personCtrl' 

ないことが最良の方法だと確信し。それはきれいに見えます。どう思いますか ?

+3

これは機能しますが、不要なアプリケーション全体に指令のコントローラを公開することを意味します。 –