web-dev-qa-db-ja.com

Angular YeomanアプリでGruntビルドを縮小した後の「不明なプロバイダー」エラー

Yeomanで生成されたgrunt buildで問題が発生しましたAngularアプリ、CoffeeとSlimを使用し、すべてのライブラリが最新の状態です。(アプリは数日生成されたばかりです以前は最新のジェネレータを使用していました。)

grunt buildgrunt serverはどちらも最初は問題なく動作していました。しかし、grunt serverを使用した開発の数日後、grunt buildが完全に機能しなくなったことに気付きました。

私が修正したいくつかの異なる問題がありました。最大の問題は、grunt build/distにパブリッシュされたときにインデックスファイルの80%が不可解に削除されたため、Slimを完全に放棄し、ストレートHTMLを使用する必要があったことです。

残念ながら、ほとんどすべてを解決した後、私のAngularディレクティブの1つでこのエラーが発生し始めました。

不明なエラー:不明なプロバイダー:aProvider <-a

問題は醜いようです。同じ問題が報告された可能性があると思います here ですが、確実ではありません。私はいくつかの解決策を試しましたが、私のために機能したのは、自分のコーヒースクリプトからクリーンなjsファイルを手動で生成し、そのファイルを/distにコピーしてから、パスをdist/index.htmlに書き込むことでした。

明らかにそれは最適ではありません。 Gruntでそれを行うためのきちんとした方法があると確信しています(おそらく、上記のリンクで他のユーザーが行ったように、ビルドプロセスから完全に縮小化を削除することによって)、私はそれを初めて使用し、まだ方法を理解していませんそれをするために。いずれにせよ、それは回避策になります。

私のGruntfileはかなり基本的です。デフォルトのファイルにgrunt-connect-proxy、grunt-contrib-sass、およびgrunt-slimを追加しただけです。実際、私はクリーンで新しく生成されたGruntfileを取り込もうとしましたが、うまくビルドできませんでした。

失敗しているディレクティブは次のとおりです。エラーは実際にはコントローラーの最初の行$scope.showInput = falseに表示されます。イライラするのは、grunt serverですべてがうまく機能することです。私が構築した瞬間、それは完全にバラバラになります。

myModule.directive "editable", ->

  controller = ($scope) ->
    $scope.showInput = false

    $scope.saveContent = -> 
      $scope.toggleContent()
      $scope.save()

  linker = (scope, element, attrs) ->    
    scope.toggleContent = -> 
      scope.showInput = not scope.showInput
      setTimeout((-> element.find('input').focus()), 100)

  return DDO = 
    restrict: 'E'
    controller: controller
    link: linker
    templateUrl: "template/editable.html"
    scope:
      editableType: "@"
      text: "="
      placeholder: "@"
      save: "&"

(テンプレートはそれほど重要ではありません。ng-switchを使用して切り替わる$scope.showInputがあります。)

誰かが何か提案があれば、私はそれを感謝します。

31
javbotero

Angularが依存性注入の引数の名前に依存するという一般的な問題のようです。 Angularは、圧縮後に何を注入するかがわかるように、依存関係の名前を文字列として含む依存関係を渡すとき(文字列の値は縮小プロセスで変更されないため)。

myApp.controller('myCtrl', ['$scope', '$http', function($scope, $http) {

}])

From Angular docs:minificationに関する注意

46
m59