2013-10-06 14 views
19

私はコントローラのスコープからディレクティブのコントローラーの "&"操作を介してディレクティブに渡された関数を呼び出そうとしています。しかし、その方法は、Angularによって定義されていないと主張されている。私のコードを何度も何度も読んだ後、インターネットを磨き、そのプロセスを繰り返すことで、私はここで助けに行くことにしました。AngularJS:コントローラ内で呼び出されるディレクティブの分離されたスコープに関数を渡しますか?

ここに私のコントローラの関連部分があります。私の指示に渡す方法が含まれています。

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

私の指示です。私は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(); 
        } 
       }); 
      }; 
     }, 
    }; 
}]); 

そして、ここでは、私は、問題は私のpostalServiceサービスではないことを知っている私のhtml

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

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

</div> 

の関連部分です。代わりに、ディレクティブは関数がそれに渡されないことを報告します。なぜ??

答えて

24

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

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

を交換し、それがうまくいきます。それはそうだ、なぜ

Angular docsは言う:

ディレクティブは、ngBindなどラクダ同棲名前を持っています。この指令は、 の特殊文字:、 - 、または_を使用して、ラクダのケース名をスネークケースに変換することによって呼び出すことができます。

+0

ああ、もちろん!具体的な理由はありますか?(バグトラッカーが彼の髪の毛を裂く以外に)角度がありますか? – thebradbain

+0

@thebradbain私はそれについてまっすぐな答えを持っていませんが、W3Cから来るほとんどの標準はハイフンで小文字を使用する傾向がありますので、Angularの人はその規約に固執しています。私自身は、ラクダ・ケースもパスカル・ケースも書かれていないHTMLマークアップへの実行を覚えていません。 –

+4

HTMLは本質的に大文字小文字を区別しません。属性onPostは属性onpostと同等です。したがって、JavaScript camelCase ==> HTMLスネークケースの規約は合理的です。 – MikeMac

関連する問題