2016-10-11 5 views
1

私は、アプリケーションの顧客に対するコメントの管理(作成/更新/削除)のためのディレクティブを作成しました。 ユーザーに同じコメント機能(ルック・アンド・フィール)を提供したいので、唯一必要なことはCustomersServiceを私のUsersServiceに置き換えることです。 どちらのサービスも「クルドーイング」コメントと同じメソッドを持っています(可能であれば、両方ともICommentsServiceインターフェイスを実装します)。AngularJs 1:ディレクティブ宣言からコントローラにサービスを挿入する方法

私の質問は、できるだけ私が作成したビューとコントローラを再利用して、コードを複製する必要はありません。

私の初期のアプローチは、同じビューおよびコントローラを参照する2つの別個のディレクティブ(CustomerCommentsUserComments)を作成することであるが、それぞれCustomersService又はUsersServiceを注入します。私がこれに直面している問題は、別のファイルにコントローラを持っている間に、ディレクティブ宣言に "DI定義"を保持する方法です...?

これは私のディレクティブ宣言です:

angular.module('myApp').directive('myComments', [ 
    function() { 
     'use strict'; 
     return { 
      restrict: 'E', 
      scope: { 
       commentId: '=' 
      }, 
      templateUrl:'mycomments.html', 
      controller: 'CommentsCtrl', //<-- How to define injected objects here? 
     }; 
    } 
]); 

...これは私のコントローラである:

angular.module('myApp').controller('CommentsCtrl', [ 
    '$scope', 
    '$q', 
    'CustomersService', //<-- These "DI-objects" should be defined in the directive declaration 
    function ($scope, $q, commentsService) { 

     $scope.addComment = function(comment){ 
      commentsService.addComment(comment); 
     }; 


     $scope.getComment = function(commentId){ 
      retur commentsService.getComment(commentId); 
     }; 

     //...etc... 
    } 
]); 

それともこれを解決するためのより良い方法がありますか?

+0

_「ここに注入されたオブジェクトを定義するには?」_ - 以下のように同じように。 – zeroflagL

+0

@zeroflagLありがとうございますが、コントローラがディレクティブ宣言のインライン関数として定義されている場合、構文を正しく取得できませんでした。 コードスニペットを少し高く評価すると...! :) – YonZo

+0

あなたの 'templateUrl:mycomments.html''は、一重引用符が始まっていません。 'templateUrl: 'mycomments.html'' –

答えて

1

通常、ディレクティブのコントローラは明示的に登録しません。

function CommentsCtrl($scope, $q, commentsService) { 

そして、あなたのディレクティブ(秒)で:それはあなたが持っているだろうどこかにある

controller: ['$scope','$q','CustomersService', CommentsCtrl] 
+0

素晴らしい、ありがとう - まさに私が探していたもの! しかし、これが縮小後でも機能するのだろうか? 私の推測では、小型化プロセスは関数名とコントローラ定義を別の方法で "難読化"し、コードを破るということでしょうか? – YonZo

関連する問題