2017-07-20 7 views
1

Edit : corrected the foo method.

Je suis un junior AngularJS, et je luttais avec cela. J'utilise une directive avec des méthodes de prototypage, et j'aimerais en émettre un même à l'intérieur, mais je n'ai pas réussi à le faire fonctionner jusqu'à présent.

angular.module('myModule') 
    .directive('myDirective', function() { 
     return { 
      transclude: true, 
      scope: { 
      }, 
      bindToController: true, 
      controller: MyController, 
      controllerAs: 'myCtrl', 
      templateUrl: 'template/myTemplate.html' 
     }; 
    } 
); 

Ensuite, j'ai le contrôleur qui ressemble à ceci. Il semble que j'ai raté l'injection $ scope, car elle n'est pas définie.

Quelqu'un pourrait-il me dire ce que j'ai fait de mal? Ce serait grandement apprécié!

+0

Le code du contrôleur n'a pas de sens. Qu'est-ce que 'StepperCtrl' et quel est le lien avec le code du contrôleur? – georgeawg

+0

Je recommande d'isoler les directives de portée évitez d'utiliser $ emit pour communiquer des événements. Au lieu de cela, communiquez les événements avec l'expression '&' binding. – georgeawg

+0

Vous montrez MyController comme constructeur, puis une méthode prototype de StepperCtrl. Est-ce une faute de frappe? Si c'est le cas et que vous vouliez utiliser 'MyController.prototype.foo' alors vous pouvez simplement faire ceci: $ scope. $ Emit' dans la méthode prototype parce que vous avez déjà défini' this. $ Scope' dans le constructeur. – Adam

Répondre

1

Vous avez défini this.$scope = $scope; dans le constructeur, vous devriez donc également accéder à la portée comme propriété d'instance:

this.$scope.$emit('fooEvent'); 
+0

J'ai essayé cela, mais j'ai eu l'erreur $ emit est indéfini ou quelque chose. – BigFoot

+1

@BigFoot - 'est indéfini ou quelque chose '- c'est un message d'erreur extrêmement inutile pour dire à quelqu'un qui essaie de vous aider. – Adam

+0

@Adam - Toutes mes excuses, j'étais sur le point de quitter le bureau et je ne pouvais pas me souvenir de l'erreur exacte, et je n'avais pas le temps de la reproduire ensuite. Le voici: 'TypeError: Impossible de lire la propriété '$ emit' de undefined' – BigFoot

0

Pour ce qu'il vaut la peine, voici un exemple de la façon d'écrire un contrôleur en tant que classe:

class MyController { 
 
    constructor($mdComponentRegistry, $attrs, $log,$scope) { 
 
     this.$scope = $scope; 
 
     this.$mdComponentRegistry = $mdComponentRegistry; 
 
     this.$attrs = $attrs; 
 
     this.$log = $log; 
 
    } 
 
    $onInit() { 
 
     this.hello = 'hello'; 
 
     this.currentStep; 
 
     this.foo(); 
 
    } 
 
    foo() { 
 
     console.log("Executing foo function"); 
 
     console.log(this.$scope.myCtrl.hello); 
 
     console.log("$emit is a", typeof this.$scope.$emit); 
 
    } 
 
} 
 
MyController.$inject = ['$mdComponentRegistry', '$attrs', '$log', '$scope']; 
 

 
angular.module('myModule',[]) 
 
    .directive('myDirective', function() { 
 
     return { 
 
      scope: { 
 
      }, 
 
      bindToController: true, 
 
      controller: MyController, 
 
      controllerAs: 'myCtrl', 
 
      template: 
 
       `<fieldset>myDirective {{myCtrl.hello}} 
 
       </fieldset>` 
 
     }; 
 
    } 
 
) 
 
.value('$mdComponentRegistry', {})
<script src="//unpkg.com/angular/angular.js"></script> 
 
    <body ng-app="myModule"> 
 
    <h2>Controller Written as a Class</h2> 
 
    <my-directive></my-directive> 
 
    </body>