0

角度コンポーネントを含む動的なtemplateUrlを作成しようとしています。上記のように縮小さばかりのファイル、その投げエラーとしてAngular.jsのコンポーネントdynamic templateURL

Error: [$injector:unpr] Unknown provider: eProvider <- e

angular 
    .module('myApp') 
    .component('fieldComponent', { 
     templateUrl: function ($element, $attrs) { 
      return $attrs.templateUrl || 'some/path/default.html' 
     }, 
     controller:fieldComponentController, 
     controllerAs:'vm', 
     $routeConfig: [ 
      {path: '/dashboard', component: 'dashboardApp', name: 'Dashboard', useAsDefault: true} 
     ] 
    }); 

:しかし、私はこのエラーを取得します。だから&私はこの依存関係を注入する方法は?

答えて

0

私は@Mattリチャーズにより示唆されるように先頭に/ @ngInject /を追加することによってそれを行うことができました。

/*@ngInject*/ 
angular 
    .module('myApp') 
    .component('fieldComponent', { 
     templateUrl: function ($element, $attrs) { 
      return $attrs.templateUrl || 'some/path/default.html' 
     }, 
     controller:fieldComponentController, 
     controllerAs:'vm', 
     $routeConfig: [ 
      {path: '/dashboard', component: 'dashboardApp', name: 'Dashboard', useAsDefault: true} 
     ] 
    }); 

しかしが、最終的には私はむしろ、動的テンプレートアプローチに向かうng-includeになってしまった、とユニットテストケースをカバーする私の時間を救いました。

1

私はfieldComponentControllerのDIが縮小によって壊れていると思います。コードが縮小されると、依存関係の名前が 'e'のようなものに変更されます。これはAngularが処理方法を知らないためです。

これに対処する方法の1つは、ng-annotate(https://github.com/olov/ng-annotate)を使用して、変数名を安全性の低い方法で書き直すことです。あなたのバンドルや縮小を行うにはWebPACKのようなビルドツールを使用している場合

は、単にあなたのコントローラの定義の一番上にあなたの設定にngAnnotatePluginを追加し、文字列「ngInject」を含めることができ

angular.module("MyMod").controller("MyCtrl", function($scope, $timeout)   
{ 
"ngInject"; 
... 
}); 

ES2015バージョン:

export class MyCtrl { 
    constructor($scope, $timeout){ 
     'ngInject'; 
    } 
} 
+0

コントローラ内部でサービスを注入するのは良いですが、templateurl関数のために同じようにする方法はありますか? – Mithun

+0

Hmmmmm - わかりません。私はあなたがコントローラーにこれらの依存関係を注入して、動的にテンプレートを読み込むng-includeを使ってdivを使ってテンプレートを動的に設定できるのだろうかと思います –

関連する問題