2013-10-06 38 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(); 
        } 
       }); 
      }; 
     }, 
    }; 
}]); 

這是我的HTML

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

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

</div> 

的相關部分,我知道這個問題是不是與我的postalService服務。相反,該指令報告沒有函數傳遞給它。爲什麼??

回答

24

更換

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

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

,它會工作。

Angular docs說爲什麼它是如此:

指令有駱駝套管的名稱,如ngBind。該指令可以是 ,通過將駝峯案例名稱翻譯爲蛇案,並使用這些 特殊字符:, - 或_來調用。

+0

啊,當然! Angular有什麼特別的理由嗎(除了讓bug追蹤者撕掉他的頭髮)? – thebradbain

+0

@thebradbain我對此沒有直接的答案,但是來自W3C的大多數標準都傾向於使用連字符使用小寫字母,所以我會說Angular的人只是堅持這一慣例。我自己也不記得遇到任何既不是駝峯案也不是pascal案的HTML標記。 –

+4

HTML本質上不區分大小寫 - onPost屬性等同於onpost屬性。因此,JavaScript camelCase ==> HTML snake案例的慣例是合理的。 – MikeMac

相關問題