Существует несколько доступных способов определения контроллера в AngularJs. Конкретно:
- синтаксис "прикрепить к
$scope
" - синтаксис "контроллер как"
controller()
функция
Демонстрация кода из вышеперечисленного:
// 1)
ng-controller="MyControllerFn"
// 2)
ng-controller="MyControllerFn as myCtrl"
// 3)
myModule.controller("myCtrl", MyControllerFn);
// or
myApp.controller("myCtrl", ["$scope", function($scope) {
}]);
Конечно, у каждого из них есть свои плюсы и минусы. В настоящее время я использую вариант 1). Моя проблема в том, что я не знаю, не упущу ли я что-нибудь в долгосрочной перспективе, теперь, когда мне доступен новый синтаксис «контроллер как». Наш проект довольно большой, и я не могу представить, что буду переписывать все на новый синтаксис через год или около того только потому, что старый устарел. Я бы предпочел постепенно переходить сейчас и писать новый код «хорошим способом», начиная с сегодняшнего дня.
Немного ЗА и ПРОТИВ:
1)
- (хорошо) меньше шаблонов по сравнению с 3), так как автоматическое обнаружение контроллеров позаботится об объявлении для вас, когда оно встречает директиву
ng-controller
- (плохо) поддерживает правильный DI:
MyControllerFn.$inject = [...]
- (плохо) сложнее ориентироваться в дереве наследования контроллера
2)
- (хороший) псевдоним контроллера дает понять, к каким переменным области относятся
- (хороший) более чистый синтаксис контроллера из-за назначения переменных
this
- (хорошо), кажется, улучшается поддержка инструментов (IDE)
- (плохо) склонен к ошибке добавления слишком большого количества элементов в область видимости, например: `this.arr = ...; // массив из 1 млн элементов'
3)
- (нейтрально) минификация сделана правильно (ну, это можно сделать с помощью свойства
$inject
) - (плохо) более подробный синтаксис, которого можно полностью избежать с помощью автообнаружения
Хорошо, так я что-то пропустил? Может быть, я не вижу чего-то очевидного, так как совсем недавно перешел на 1.2?
= РЕДАКТИРОВАТЬ
Чтобы было понятно, есть разница между привязкой и объявлением контроллера. Первые два продемонстрированных варианта связаны с привязкой контроллера к DOM, а третий — с явным объявлением его в модуле angular. Противоположностью последнему было бы разрешение Angular проходить через DOM и автоматически обнаруживать контроллер, что я предпочитаю делать.