2017-04-07 8 views
0

Je sais qu'il y a beaucoup de ces questions, mais mon est spécifique. J'utilise Typescript avec AngularJS. Je veux obtenir une variable de multimediaController à multimediaAlbumController. Je reçois "[$ injector: unf] Fournisseur inconnu: multimediaControllerProvider < - multimediaController < - multimediaAlbumController". Comment puis-je l'empêcher?AngularJS fournisseur inconnu - Pour les contrôleurs

MultimediaAlbumController

export class MultimediaAlbumController{ 
    $scope; 
    albums  : AlbumDto[]; 
    $popupManager; 
    $state; 
    $element; 
    mutlimediaController; 
    static $inject = ['$injector', '$scope', '$stateParams', '$state', '$popupManager', '$element','multimediaController'] 
    constructor(
      $injector   : ng.auto.IInjectorService, 
      $scope, 
      $stateParams, 
      $state, 
      $popupManager, 
      $element, 
      mutlimediaController: MultimediaController 
     ) { 
     super(); 
     $injector.invoke(this.init, this, {$scope}); 
     this.$scope = $scope; 
     this.$element = $element; 
     this.$state = $state; 
     this.$popupManager = $popupManager; 
     this.mutlimediaController = MultimediaController; 
     this.albums = mutlimediaController.albums; 
} 

Comme vous pouvez le voir, je l'ai déclaré multimediaController, écrire même dans inject $. Alors, où est le bug? :/

+0

Il semble que le 'multimediaController' n'est pas enregistré par votre module, il ne sait pas quoi il injectent – devqon

+0

Mais je découvre que je ne peux pas injecter un contrôleur à, donc Je le fais mal :(Des idées, comment puis-je obtenir cette variable? – qwerty1234567

Répondre

2

Vous ne devriez pas inject un contrôleur dans un autre plutôt que vous devriez utiliser service\factory.

Toutefois, pour obtenir le scope de mutlimediaController, vous devez injecter $controller service de angularjs. Vous pouvez le faire IKE:

static $inject = ['$injector', '$scope', '$stateParams', '$state', '$popupManager', '$element','$controller'] 

    constructor(
      $injector: ng.auto.IInjectorService, 
      $scope, 
      $stateParams, 
      $state, 
      $popupManager, 
      $element, 
      $controller 
     ) { 
     super(); 
     $injector.invoke(this.init, this, {$scope}); 
     this.$scope = $scope; 
     this.$element = $element; 
     this.$state = $state; 
     this.$popupManager = $popupManager; 
     var mutlimediaController = $controller('MultimediaController', {this.$scope: $scope}); 
     mutlimediaController.someFunction();// some function of your MultimediaController 
     this.albums = mutlimediaController.albums; 
} 

Mais je suggère faire un service/usine pour accéder aux données communes.

Comme:

myApp.service('myService', function() { 
    var text = ''; 
    this.getValue = function() { 
     return text; 
    } 
    this.setValue = function (data) { 
    return text = data; 
    } 
}); 

//Inside controller  
myApp.controller('MyCtrl', function MyCtrl($scope, myService) { 
myService.setValue ("data to service"); 
$scope.message = myService.getValue(); 
}); 
+0

Hmmm .. ont fait comme vous l'avez écrit et je reçois Le contrôleur avec le nom «MultimediaController» n'est pas enregistré – qwerty1234567

+0

Quoi qu'il en soit, ça va. Je peux accéder à ces données à partir d'un autre contrôleur (j'ai un service, mais je pensais que je ne devrais pas tirer à nouveau pour les données de la base de données) – qwerty1234567

+0

J'espère que je suppose que vous avez enregistré votre co ntroller like 'exporter classe MultimediaController { // code contrôleur } app.controller ('MultimediaControllerl', MultimediaControllerl);' mais je suggère d'utiliser votre service. – anoop