2015-06-06 2 views
-1

Если директива напрямую использует контроллер, почему вы вызываете метод на контроллере, ссылаясь на контроллер по его псевдониму, не делая ничего?Путаный случай при использовании контроллера и контроллера. В директиве

Представьте, что мы имеем следующий фрагмент кода:

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» (переменная, доступная путем впрыска в контроллер и в которой ищет шаблон). Если ваш вопрос: «Почему это так?», Здесь нет темы. Если нет, уточните пожалуйста. – Blackhole

ответ

0

ControllerAs выставляет экземпляр контроллера на сфере под $scope[alias].

В вашем примере, область выглядит (концептуально), как это:

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

Таким образом, вы можете понять, почему ng-click="myCtrl.doAction()" не работает.

Метод Controller-As имеет некоторые преимущества по сравнению с непосредственным представлением свойств в области видимости - один из них заключается в том, что он не загрязняет область (и ее потомков) свойствами, которые им могут не понадобиться. Он также по своей сути обеспечивает точечный подход (.) для правильной работы с ng-model. Более подробную информацию вы найдете в этом SO question/answer.

Смежные вопросы