19

Ich versuche, eine Funktion, die aus dem Bereich eines Controllers übergeben wird, über den "&" -Betrieb vom Controller der Direktive in eine Direktive zu rufen. Diese Methode wird von Angular jedoch als undefiniert bezeichnet. Nachdem ich meinen Code immer und immer wieder gelesen, das Internet durchforstet und diesen Vorgang wiederholt habe, habe ich mich entschlossen, hier Hilfe zu suchen.AngularJS: Übergeben einer Funktion an einen isolierten Bereich einer Richtlinie, die innerhalb ihres Controllers aufgerufen werden soll?

Hier ist der relevante Teil meines Controllers. Es enthält die Methode, die ich an meine Direktive übergebe.

angular.module('myApp.controllers', []).controller('PostCtrl', ['$scope', 'postalService', function($scope, postalService) { 
    $scope.posts = []; 

    $scope.getPosts = function() { 
     postalService.getPosts(function(err, posts) { 
      if(err); 
      else $scope.posts = posts; 
     }); 
    }; 
}]); 

Hier ist meine Anweisung. Ich kann onPost nicht aufrufen.

angular.module('myApp.directives', []).directive('compose', ['postalService', function(postalService) { 
    return { 
     restrict: 'E', 
     transclude: false, 
     replace: true, 
     scope: { 
      onPost: "&" //why will it not 
     }, 
     templateUrl: "partials/components/compose-partial.html", 
     controller: function($scope, postalService) { 
      $scope.title = ""; 
      $scope.content = ""; 
      $scope.newPost = function() { 
       postalService.newPost($scope.title, $scope.content, function(err) { 
        if(err) console.log(err + ":("); 
        else { 
         console.log("Success getting posts."); 
         //why can I not invoke onPost()?? 
         $scope.onPost(); 
        } 
       }); 
      }; 
     }, 
    }; 
}]); 

Und hier ist der relevante Teil meiner html

<div ng-controller="PostCtrl"> 
    <section class="side-bar panel hide-for-small"> 
     <compose onPost="getPosts()"></compose> 
    </section> 

    <!--more, non-relevant html here--> 

</div> 

Ich weiß, dass das Problem nicht mit meinem Postal Dienst ist. Stattdessen meldet die Anweisung, dass keine Funktion an sie übergeben wurde. Warum?? Ersetzen

Antwort

24

<compose onPost="getPosts()"></compose> 

mit

<compose on-post="getPosts()"></compose> 

und es wird funktionieren.

Die Angular docs sagen, warum es so:

Richtlinien Kamel verrohrten Namen wie ngBind haben. Die Anweisung kann aufgerufen werden, indem der Name des Kamelfalls in Schlangenfall mit diesen Sonderzeichen übersetzt:, -, oder _.

+0

Ah natürlich! Gibt es einen bestimmten Grund dafür, dass Angular dies tut (abgesehen davon, dass er einem Bug-Tracker die Haare ausreißt)? – thebradbain

+0

@thebradbain Ich habe keine klare Antwort dafür, aber die meisten Standards, die aus dem W3C kommen, verwenden normalerweise Kleinbuchstaben mit Bindestrichen, also würde ich sagen, dass die Angulars nur bei dieser Konvention geblieben sind. Ich kann mich nicht daran erinnern, in irgendein HTML-Markup zu geraten, das weder in camel case noch in pascal case geschrieben wurde. –

+4

HTML ist von Natur aus case-insensitive - Attribut onPost entspricht dem Attribut onpost. Daher ist eine Konvention von JavaScript camelCase ==> HTML snake-case sinnvoll. – MikeMac

Verwandte Themen