2013-10-06 20 views
19

Sto provando a chiamare una funzione passata dall'ambito di un controllore in una direttiva tramite l'operazione "&" dal controller della direttiva. Questo metodo, tuttavia, viene rivendicato da Angular per essere indefinito. Dopo aver letto il mio codice più e più volte, perlustrando Internet, e poi ripetendo quel processo, ho deciso di rivolgermi per aiutare qui.AngularJS: inoltrare una funzione a un ambito isolato di una direttiva per essere chiamata all'interno del relativo controller?

Ecco la parte rilevante del mio controller. Contiene il metodo che passo alla mia direttiva.

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; 
     }); 
    }; 
}]); 

Ecco la mia direttiva. Non riesco a invocare onPost.

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(); 
        } 
       }); 
      }; 
     }, 
    }; 
}]); 

Ed ecco la parte rilevante del mio html

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

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

</div> 

So che il problema non è con il mio servizio PostalService. Invece, la direttiva riporta che non è stata passata alcuna funzione. Perché??

risposta

24

Sostituire

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

con

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

e che funzionerà.

Il Angular docs dire perché è così:

direttive hanno nomi cammello con carter quali ngBind. La direttiva può essere invocata traducendo il nome del caso cammello in caso di serpente con questi caratteri speciali :, -, o _.

+0

Ah, naturalmente! C'è qualche ragione specifica per cui Angular lo fa (oltre a far strappare i capelli a un bug-tracker)? – thebradbain

+0

@thebradbain Non ho una risposta diretta per questo, ma la maggior parte degli standard che provengono dal W3C tendono ad usare lettere minuscole con trattini, quindi direi che i ragazzi di Angular si sono limitati a questa convenzione. Io stesso non ricordo di aver eseguito alcun markup HTML scritto né in un caso di cammello né in un caso pasquale. –

+4

HTML è insensibile alle maiuscole e minuscole: l'attributo onPost è equivalente all'attributo onpost. Pertanto, una convenzione di JavaScript camelCase ==> HTML snake-case è ragionevole. – MikeMac

Problemi correlati