Где разместить обработчики кликов, используя синтаксис controllerAs в директивах

При использовании синтаксиса controllerAs в AngularJS, что является лучшим местом для определения обработчиков для ng-click и тому подобное? На контроллере или в области (определено в функции связи)?

Итак, вы используете:

angular.module('app', []).
    controller('myDirective', function(){
        return {
            template: '<div><button ng-click=vm.onClick()></button></div>',
            controller: function(){
                var vm = this;

                vm.onClick = function(){
                    vm.myValue = vm.doSomethingFancy();
                };

                this.doSomethingFancy = function(){};
            }
        }
    });

Или же:

angular.module('app', []).
    controller('myDirective', function () {
        return {
            template: '<div><button ng-click=onClick()></button></div>',
            require: 'myDirecive',
            controller: function () {
                var vm = this;

                this.doSomethingFancy = function () {
                    vm.myValue = 'somethingfancy';
                };
            },
            link: function (scope, elem, attr, ctrl) {
                scope.onClick = function () {
                    ctrl.doSomethingFancy();
                }
            }
        }
    });

Мне на самом деле нравится второй, потому что теперь контроллер только присваивает значения, а обработка событий выполняется в функции ссылки.

В любом случае... дай мне знать, что ты думаешь.

2 ответа

Это не все установленные в камне правила, но вы можете использовать следующее как руководство:

Разделение Концерна

  • Изменить данные модели в контроллере
  • Изменить DOM/UI в директиве

Есть ли doSomethingFancy сделать что-нибудь модное с вашей моделью (по объему)? - Иди с контроллером.

Есть ли doSomethingFancy сделать что-нибудь модное с пользовательским интерфейсом? - перейти по ссылке

Условия гонки

  • Код контроллера выполняется перед компиляцией шаблона
  • Функция Link выполняется после компиляции шаблона

Это не совсем так: вы также можете использовать pre метод связи.

Здравый смысл

Если ваш код более читабелен, поместив простую маленькую функцию в методе link, используйте метод link. Над дизайном просто соблюдать некоторые правила - нехорошо:) Шаблоны MV* - это рекомендации.

Короче говоря: нет никакой разницы. Функция контроллера запускается раньше, но обычно это не имеет значения. Если ваши обработчики не имеют сложной логики, зависящей от внешних сервисов - поместите их в ссылку, иначе - контроллер лучше

Короткая история: есть похожий вопрос, на который ответили более подробно:

Разница между функциями 'controller', 'link' и 'compile' при определении директивы

Другие вопросы по тегам