2014-01-19 3 views
5

私は角度でD3.jsを統合しようとしてきたが、このチュートリアルの次のです: http://www.ng-newsletter.com/posts/d3-on-angular.htmlAngularJS:指示にサービスを注入しますか?

チュートリアルでは、d3Serviceが含まれているD3モジュールを作成し、それをディレクティブに注入します。私のアプリは少し構造が異なりますが、d3サービスを注入しようとすると、linkの指示にundefinedと表示されます。私は問題なしで私のコントローラにd3サービスを注入できます。ここで私がやっているものです:

app.js

var sentimentAppServices = angular.module('sentimentAppServices', ['ngResource']) 
// other services 
.factory('d3', [function(){ 
    var d3; 
    d3 = // d3 library code here 
    return d3; 
}]); 

directives.js中:

var sentimentAppDirectives = angular.module('sentimentAppDirectives', ['sentimentAppServices']); 

sentimentAppDirectives.directive('lsPieChart', ['d3', function($compile, d3){ 
    return { 
    // scope & template 
    link: function($scope, elem, attr, ctrl) { 
     console.log(d3); // undefined 
    } 
    } 

var sentimentApp = angular.module('sentimentApp', [ 
    'ngRoute', 
    'ngSanitize', 
    'sentimentAppServices', 
    'sentimentAppDirectives', 
    'sentimentAppControllers' 
]); 

services.jsの中で、私はの一つはD3である、いくつかのサービスを持っています

ヒント?ありがとう。

答えて

12

問題は、あなたのほのめかしの依存関係は、あなたが実際に渡しているものに一致しないということです。だから、

['$compile, d3', function($compile, d3 

、何をやっていたことは、変数$compileとしてd3サービスを渡すと、渡していません変数d3と同じものがあります。

これが何であるかを理解するのに役立つかもしれません。非縮小さのコードでは、あなたは完全にその配列のラッパーを取ることができ、このように:文字列は縮小の影響を受けませんので、

app.directive('directiveName', function($compile, d3) { 
    // .... 
}); 

文字列として名前を渡すのポイントです。これは、角度は、このような場合には、右の依存関係を注入する方法を知っているだろうことを意味します

['$compile, d3', function(a, b 

aがあなたのd3サービスへ$compileサービスとbに設定されます。

+0

自動的に行われるように、ngmin utilitiy(縮小前に行う場合)を使用する場合、これは常に必要ではないことに注意してください。これは、誤って件名に記載されているような同様の問題に遭遇する可能性があるので、メンテナンスを簡単にすることができます。 –

+0

もちろん!ありがとうございました。 – bjudson

関連する問題