2015-06-06 65 views
-1

使用控制器和controllerAs時,如果指令直接使用控制器,爲什麼呼籲通過它的別名,沒有做任何事情指的控制器,控制器上的方法?混亂的情況下,在一個指令

假設我們有如下一段代碼:

var app = angular.module('App', []); 

    app.controller('MyController', ['$scope', function($scope) { 
     $scope.doAction = function() { 
     alert("controller action"); 
     } 

     this.doAction2 = function() { 
     alert("controller action 2"); 
     } 
    }]); 

    app.directive('myDirective', [function() { 
     return { 
     restrict: 'E', 
     scope: {}, 
     controller: 'MyController', 
     controllerAs: 'myCtrl', 
     bindToController: true, 
     template: "<a href='#' ng-click='myCtrl.doAction()'>Click it!<a><br><a href='#' ng-click='myCtrl.doAction2()'>Click it #2!<a> " , 
     link: function($scope, element, attrs, controller) { 
      console.log($scope); 
     } 
     } 
    }]); 

雖然第一個鏈接將無法正常工作,第二個會。爲了使第一個工作,我不得不放棄別名,而不是通過ng-click='myCtrl.doAction()'調用該動作,將其稱爲:ng-click='doAction()'

它不應該使用別名嗎?我的意思是,你更容易找到和重用控制器,其中開發人員連接動作到$scope對象,而不是this

+0

這是從你的最後一句話,似乎你已經完全理解和'$ scope'(注射控制器和利用模板尋找一個變量訪問)this'(控制器對象)之間'的區別。如果你的問題是「爲什麼它是這樣設計的?」,那麼這裏就不是題目。如果沒有,請澄清。 – Blackhole

回答

0

ControllerAs暴露於$scope[alias]下範圍控制器實例。

在你的榜樣,範圍如下(概念上)這樣的:

$scope = { 
    $id: 5, 
    myCtrl: { 
    doAction2: function(){...} 
    }, 
    doAction: function(){...} 
} 

所以,你可以看到爲什麼ng-click="myCtrl.doAction()"不起作用。

的控制器,由於方法比對範圍直接暴露性質一些好處 - 一個是,它不污染與他們可能不需要的屬性範圍(及其後代)。它還提供了固有的點的方法(.)與ng-model正常工作。你可以找到在這個SO question/answer更多信息。