Próbuję wywołać funkcję przechodzącą z zakresu kontrolera do dyrektywy przez operację "&" z kontrolera dyrektywy. Metoda ta jest jednak uznawana przez Angular za niezdefiniowaną. Po przeczytaniu mojego kodu w kółko, przeszukiwaniu Internetu, a następnie powtarzaniu tego procesu, postanowiłem zwrócić się o pomoc tutaj.AngularJS: Przekazanie funkcji do izolowanego zakresu dyrektywy, która ma zostać wywołana w jego kontrolerze?
Oto odpowiednia część mojego kontrolera. Zawiera metodę, którą przekazuję do mojej dyrektywy.
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;
});
};
}]);
Oto moja dyrektywa. Nie mogę się odwołać 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();
}
});
};
},
};
}]);
A oto odpowiednia część mojego html
<div ng-controller="PostCtrl">
<section class="side-bar panel hide-for-small">
<compose onPost="getPosts()"></compose>
</section>
<!--more, non-relevant html here-->
</div>
wiem, że problem nie jest z mojej postalService Service. Zamiast tego dyrektywa zgłasza, że nie przekazano jej żadnej funkcji. Czemu??
Ah, oczywiście! Czy istnieje jakiś szczególny powód, dla którego Angular to robi (poza tym, że narzędzie do wykrywania błędów wyrywa mu włosy)? – thebradbain
@ thebradbain Nie mam prostej odpowiedzi, ale większość standardów, które pochodzą z W3C, używają małych liter ze spikerami, więc powiedziałbym, że Angularczycy po prostu trzymali się tej konwencji. Ja osobiście nie pamiętam, aby używać wszelkich znaczników HTML zapisanych zarówno w przypadku wielbłądów, jak i w przypadku pascala. –
HTML jest z natury niewrażliwy na wielkość liter - atrybut onPost jest równoważny atrybutowi onpost. Dlatego też rozsądna jest konwencja JavaScript camelCase ==> HTML snake-case. – MikeMac