2013-03-22 8 views
222

私は以下のようなディレクティブにサービスを注入しようとしています:ディレクティブにサービスを挿入できますか?

var app = angular.module('app',[]); 
app.factory('myData', function(){ 
    return { 
     name : "myName" 
    } 
}); 
app.directive('changeIt',function($compile, myData){ 
    return { 
      restrict: 'C', 
      link: function (scope, element, attrs) { 
       scope.name = myData.name; 
      } 
     } 
}); 

しかし、これは私にエラーUnknown provider: myDataProviderを返しています。誰かがコードを見て、私が何か間違っているかどうか教えてください。

答えて

367

あなたはディレクティブに注入を行うことができ、そしてそれは他のどこでもないだけのように見えます。

app.directive('changeIt', ['myData', function(myData){ 
    return { 
     restrict: 'C', 
     link: function (scope, element, attrs) { 
      scope.name = myData.name; 
     } 
    } 
}]); 
+12

私はこれがより良い解決策だと思うあなたのコードを細かくしても機能します。 – czerasz

+5

私はreturn {}の前に '_myData = myData'を追加して、リンク関数の中でオブジェクトを_myDataとして参照しなければなりませんでした。 – Jelling

+0

ありがとう@ジェリング。私は同じことをしなければならなかった。そこにいる誰かがなぜ私たちに教えてくれるのだろうか? – sfletche

19

ディレクティブの定義をapp.moduleからapp.directiveに変更してください。それ以外は、すべてがうまく見えます。 Btwは、ごくまれに、サービスを指令に注入する必要があります。ディレクティブ(ある種のビューの一部)にサービス(通常はデータソースまたはモデル)を注入する場合は、ビューとモデルを直接結合することになります。コントローラーを使用してそれらを一緒に配線することによってそれらを分離する必要があります。

正常に動作します。あなたがしていることが間違っているかどうかは分かりません。ここには働いているのは大したことです。

http://plnkr.co/edit/M8omDEjvPvBtrBHM84Am

+0

例を挙げてください。 – Exception

+0

@Exceptionコードをフィドルに置くことはできますか?私は見て、あなたのコードが動作していない理由を参照してくださいおそらくあなたがそれを修正するのを助けることができます。 – ganaraj

+0

@Exceptionは、コードが動作していることを示す働きかけを追加しました。 – ganaraj

9

$ injectサービスを使用して、好きなサービスを取得することもできます。私は前もってサービス名を知らないがサービスインタフェースを知っていれば便利だと思う。たとえば、テーブルをngResourceエンドポイントに接続するディレクティブや、任意のapiエンドポイントと対話する一般的なdelete-recordボタンです。すべてのコントローラまたはデータソースに対してテーブルディレクティブを再実装する必要はありません。

template.html

<div my-directive api-service='ServiceName'></div> 

my-directive.directive.coffee

angular.module 'my.module' 
    .factory 'myDirective', ($injector) -> 
    directive = 
     restrict: 'A' 
     link: (scope, element, attributes) -> 
     scope.apiService = $injector.get(attributes.apiService) 

今あなたの '匿名' のサービスが完全に利用可能です。それは例えばngResourceある場合は、その後、たとえばデータ

を取得するには、標準のngResourceインターフェースを使用することができます。

scope.apiService.query((response) -> 
    scope.data = response 
, (errorResponse) -> 
    console.log "ERROR fetching data for service: #{attributes.apiService}" 
    console.log errorResponse.data 
) 

特にAPIエンドポイントとの相互作用の要素を作成するときに、この技術は非常に有用であることが私を発見しました。

関連する問題