Подтвердить что ты не робот

Использование контроллеров с директивой

Я пытаюсь следовать руководству по стилю angelJA John Papa здесь и начал переключать мои директивы на использование controllerAs. Однако это не работает. Мой шаблон не может получить доступ к чему-либо, назначенному для vm. См. Этот простой пример plnkr, демонстрирующий поведение.

http://plnkr.co/edit/bVl1TcxlZLZ7oPCbk8sk?p=preview

angular
    .module('app', []);

angular
    .module('app')
    .directive('test', test);

function test() {
    return {
        restrict: 'E',
        template: '<button ng-click="click">{{text}}</button>',
        controller: testCtrl,
        controllerAs: 'vm'
    }
}

angular
    .module('app')
    .controller('testCtrl', testCtrl);

function testCtrl() {
  var vm = this;
  vm.text = "TEST";
}
4b9b3361

Ответ 1

При использовании синтаксиса controllerAs вы не получаете доступ к $scope, как обычно, переменная vm добавляется в область видимости, поэтому ваша кнопка должна стать:

<button ng-click="click">{{vm.text}}</button>

Обратите внимание на vm., добавленный в начало text.

Вот вилка вашего Plunk с исправленным применением


Q: Знаете ли вы, как я буду обращаться к атрибутам, переданным в качестве атрибутов директивы, например, "scope: {text: '@'}"? Я тогда вынужден использовать $scope на контроллере и установить vm.text = $scope.text?

A: В статье вы ссылаетесь, есть раздел y075, в котором говорится только о таком сценарии. Посмотрите bindToController:

return {
    restrict: 'E',
    template: '<button ng-click="click">{{text}}</button>',
    controller: testCtrl,
    controllerAs: 'vm',
    scope: {
        text: '@'
    },
    bindToController: true // because the scope is isolated
};

Затем вы должны иметь доступ к vm.text

Ответ 2

С помощью "controllerAs" в области видимости в качестве свойства .vm области видимости отображается псевдоним экземпляра контроллера - vm в вашем случае.

Итак, чтобы получить доступ к его свойствам (т.е. свойствам контроллера), вам нужно указать {{vm.text}} или ng-click="vm.click".

Ответ 3

Когда вы используете синтаксис controllerAs, вы должны использовать

bindToController: true

он будет работать в вашей директиве.

Ответ 4

При использовании синтаксиса "controllerAs", как указано выше, область действия привязана к справочнику 'this'. Таким образом, это позволяет нам ввести новое пространство имен ('vm' здесь), связанное с нашим контроллером, без необходимости добавлять свойства области в дополнительный литерал объекта (например, $scope). Таким образом, доступ к чему-либо в области контроллера требует пространства имен vm, as,

'<button ng-click="click">{{vm.text}}</button>'