Для доступа к функциям контроллера используются два шаблона: this
и $scope
.
Что я должен использовать и когда? Я понимаю this
, установлен на контроллер и $scope
является объектом в цепочке областей для представлений. Но с новым синтаксисом «Controller as Var» вы можете легко использовать любой из них. Так что я спрашиваю, что лучше и каково будущее?
Пример:
С помощью
this
function UserCtrl() { this.bye = function() { alert('....'); }; }
<body ng-controller='UserCtrl as uCtrl'> <button ng-click='uCtrl.bye()'>bye</button>
С помощью
$scope
function UserCtrl($scope) { $scope.bye = function () { alert('....'); }; }
<body ng-controller='UserCtrl'> <button ng-click='bye()'>bye</button>
Лично я считаю, что this.name
это проще для глаз и более естественно по сравнению с другими шаблонами Javascript OO.
Совет пожалуйста?
Ответы:
Оба имеют свое применение. Сначала немного истории ...
$ scope - это «классическая» методика, тогда как «controller as» появился намного раньше (официально, начиная с версии 1.2.0, хотя до этого он появлялся в нестабильных предварительных выпусках).
Оба работают отлично, и единственный неправильный ответ - смешивать их в одном приложении без явной причины. Честно говоря, смешивание их будет работать, но это только добавит путаницы. Так что выбирайте один и катитесь с ним. Самое главное, чтобы быть последовательным.
Который из? Это зависит от вас. Есть еще много примеров использования $ scope, но "controller as" также набирает обороты. Один лучше другого? Это спорно. Так как вы выбираете?
комфорт
Я предпочитаю «контроллер как», потому что мне нравится скрывать область видимости $ и открывать элементы из контроллера для просмотра через промежуточный объект. Установив это. *, Я могу выставить на экран только то, что я хочу выставить из контроллера. Вы также можете сделать это с помощью $ scope, я просто предпочитаю использовать стандартный JavaScript для этого. На самом деле, я кодирую это так:
Это кажется мне чище и позволяет легко увидеть, что подвергается воздействию. Обратите внимание, что я называю переменную, которую я возвращаю, "vm", что означает viewmodel. Это просто мое соглашение.
С $ scope я могу делать то же самое, поэтому я не добавляю и не отвлекаю технику.
Так что решать вам там.
впрыскивание
С $ scope мне нужно ввести $ scope в контроллер. Мне не нужно делать это с контроллером как, если только мне это не нужно по какой-то другой причине (например, $ broadcast или watches, хотя я стараюсь избегать watches в контроллере).
ОБНОВЛЕНИЕ Я написал этот пост о 2 вариантах: http://www.johnpapa.net/do-you-like-your-angular-controllers-with-or-without-sugar/
источник
var vm = this;
Вам тоже нужно называть это vm? «Контроллер как VM». Должны ли они быть одинаковыми?$scope
удаляется в Angular 2.0. Таким образом, использованиеthis
будет подходом, которому хотят следовать другие, поскольку дата выпуска Angular 2.0 приближается.источник
Мое мнение таково, что «это» в javascript само по себе имеет достаточно проблем, и что добавление другого значения / использования для него не очень хорошая идея.
Для ясности я бы использовал $ scope.
ОБНОВИТЬ
Теперь есть синтаксис «контроллер как», обсуждаемый здесь . Я не фанат, но теперь, когда это более «официальная» конструкция AngularJS, она заслуживает некоторого внимания.
источник
Я думаю, что Controller As лучше, так как он позволяет более легко вложить области, как описано Тоддом Мотто здесь:
http://toddmotto.com/digging-into-angulars-controller-as-syntax/
Кроме того, это гарантирует, что у вас всегда есть хотя бы один. в вашем обязательном выражении, которое заставляет вас следовать рекомендациям не привязываться к примитивам .
Плюс вы можете отделиться от сферы, которая уходит в 2.0.
источник
В документации Angular прямо сказано, что
this
рекомендуется использовать. Это, в дополнение к тому,$scope
что удаляется, является достаточным основанием для меня, чтобы никогда не использовать$scope
.источник
Хорошая причина для меня звучит из-за того, что в Angular 2.0 удалена область $ jason328. И я нашел еще одну причину, чтобы помочь мне сделать выбор:
this
более читабелен - когда я вижуfooCtrl.bar
в HTML, я сразу знаю, где найти определениеbar
.Обновления: вскоре после перехода на
this
решение я начал скучать по тому$scope
, что нужно меньше печататьисточник
Я предпочитаю комбинацию.
Простой console.log из $ scope и 'this' после заполнения их некоторыми фиктивными данными покажет вам это.
$ scope позволяет получить доступ к частям контроллера, например:
** Свойства и методы с $$ не рекомендуется возиться с командой Angular, но $ может быть безопасной игрой для выполнения классных вещей с $ parent и $ id.
«this» сразу попадает в точку, добавляя данные и функции, связанные с двумя путями. Вы увидите только то, что вы прикрепили:
Так почему я предпочитаю комбинацию?
В приложениях, вложенных в ui-router, я могу получить доступ к главному контроллеру, установить и вызвать универсальные значения и функции внутри дочернего контроллера:
В главном контроллере:
В Child Controller:
Теперь вы можете получить доступ к родителю изнутри child и child от родителя!
источник
Оба работают, но если вы примените вещи, которые соответствуют области действия, к $ scope, и если вы примените вещи, которые соответствуют контроллеру, к контроллеру, ваш код будет легко поддерживать. Людям, которые говорят: «Тьфу, просто используйте область видимости, забудьте об этом контроллере как о синтаксисе» ... Он может работать так же, но мне интересно, как вы сможете поддерживать огромное приложение, не упуская из виду.
источник