Я читал о новом синтаксисе от angularJS относительноcontroller as xxx
Синтаксис
InvoiceController as invoice
сообщает Angular создать экземпляр контроллера и сохранить его в переменной invoice в текущей области.
Визуализация:
Хорошо, у меня не будет параметра $scope
в моем контроллере, и код в контроллере будет намного чище.
Но
Мне нужно будет указать другой псевдоним в представлении
Итак, до сих пор я мог:
<input type="number" ng-model="qty" />
....controller('InvoiceController', function($scope) {
// do something with $scope.qty <--notice
И теперь я могу:
<input type="number" ng-model="invoic.qty" /> <-- notice
....controller('InvoiceController', function() {
// do something with this.qty <--notice
Вопрос
Какова цель этого? убрать из одного места и добавить в другое?
Буду рад увидеть, что мне не хватает.
javascript
angularjs
Ройи Намир
источник
источник
controller as
фиксирует его).Ответы:
В этом есть несколько моментов.
Некоторым людям не нравится
$scope
синтаксис (не спрашивайте меня, почему). Говорят, что можно было просто использоватьthis
. Это была одна из целей.Очень полезно также прояснить, откуда берется свойство.
Вы можете вкладывать контроллеры, и при чтении html довольно ясно, где находится каждое свойство.
Вы также можете избежать некоторых проблем с правилом точки .
Например, имея два контроллера, оба с тем же именем name, вы можете сделать это:
Вы можете изменить как родительский, так и дочерний, без проблем. Но вам нужно использовать,
$parent
чтобы увидеть имя родителя, потому что вы затеняли его в своем дочернем контроллере. В массивном html-коде$parent
могут возникнуть проблемы, вы не знаете, откуда взялось это имя.С ним
controller as
можно:Тот же пример, но его гораздо легче читать.
$scope
plunkercontroller as
plunkerисточник
foo() { ... }
намного чище, чем$scope.foo = function() { ... }
.Основное преимущество
controller as
синтаксиса, которое я вижу, заключается в том, что вы можете работать с контроллерами как с классами, а не только с некоторыми функциями, украшающими область видимости, и пользоваться преимуществами наследования. Я часто сталкиваюсь с ситуацией, когда есть функциональность, которая очень похожа на ряд контроллеров, и наиболее очевидным является созданиеBaseController
класса и наследование от него.Несмотря на то, что существует наследование $ scope, которое частично решает эту проблему, некоторые люди предпочитают писать код в более ООП манере, что, на мой взгляд, упрощает анализ и тестирование кода.
Вот скрипка для демонстрации: http://jsfiddle.net/HB7LU/5796/
источник
Я считаю, что одно конкретное преимущество очевидно, когда у вас есть вложенные области видимости. Теперь будет совершенно ясно, из какой области исходит ссылка на свойство.
источник
Источник
Разница между созданием контроллера с использованием
$scope object
и использованием“controller as”
синтаксиса и vmСоздание контроллера с использованием объекта $ scope
Обычно мы создаем контроллер, используя объект $ scope, как показано в листинге ниже:
Выше мы создаем AddController с тремя переменными и одним поведением, используя контроллер объекта $ scope и представление, которые взаимодействуют друг с другом. Объект $ scope используется для передачи данных и поведения представлению. Он склеивает представление и контроллер вместе.
По сути, объект $ scope выполняет следующие задачи:
Передача данных из контроллера в представление
Передача поведения из контроллера в представление
Склеивает контроллер и вид вместе
Объект $ scope изменяется при изменении представления, а представление изменяется при изменении свойств объекта $ scope.
Мы прикрепляем свойства к объекту $ scope, чтобы передавать данные и поведение в представление. Прежде чем использовать объект $ scope в контроллере, нам нужно передать его функции контроллера в качестве зависимостей.
Использование синтаксиса «контроллер как» и vm
Мы можем переписать указанный выше контроллер, используя контроллер в качестве синтаксиса и переменную vm, как показано в листинге ниже:
По сути, мы назначаем это переменной vm, а затем присоединяем к ней свойство и поведение. В представлении мы можем получить доступ к AddVmController, используя контроллер в качестве синтаксиса. Это показано в листинге ниже:
Конечно, мы можем использовать в контроллере в качестве синтаксиса другое имя, кроме «vm». Под капотом AngularJS создает объект $ scope и прикрепляет свойства и поведение. Однако при использовании контроллера в качестве синтаксиса код контроллера становится очень чистым, и в представлении отображается только псевдоним.
Вот несколько шагов по использованию контроллера в качестве синтаксиса:
Создайте контроллер без объекта $ scope.
Назначьте это локальной переменной. Я предпочел имя переменной как vm, вы можете выбрать любое имя по вашему выбору.
Присоедините данные и поведение к переменной vm.
В представлении дайте контроллеру псевдоним, используя контроллер в качестве синтаксиса.
Вы можете дать псевдониму любое имя. Я предпочитаю использовать vm, если я не работаю с вложенными контроллерами.
При создании контроллера нет прямых преимуществ или недостатков использования подхода $ scope object или контроллера в качестве синтаксиса. Однако это чисто вопрос выбора, однако использование контроллера в качестве синтаксиса делает код JavaScript контроллера более читабельным и предотвращает любые проблемы, связанные с этим контекстом.
Вложенные контроллеры в объектном подходе $ scope
У нас есть два контроллера, как показано в листинге ниже:
Свойство age находится внутри обоих контроллеров, и в представлении эти два контроллера могут быть вложены, как показано в листинге ниже:
Как видите, для доступа к свойству age родительского контроллера мы используем $ parent.age. Разделение контекста здесь не очень четкое. Но используя контроллер в качестве синтаксиса, мы можем работать с вложенными контроллерами более элегантно. Допустим, у нас есть контроллеры, как показано в листинге ниже:
На представлении эти два контроллера могут быть вложены, как показано в листинге ниже:
В контроллере как синтаксис у нас есть более читаемый код, и к родительскому свойству можно получить доступ, используя псевдоним родительского контроллера вместо использования синтаксиса $ parent.
Я завершу этот пост, сказав, что это исключительно ваш выбор, хотите ли вы использовать контроллер как синтаксис или объект $ scope. У них нет огромных преимуществ или недостатков, просто контроллер как синтаксис, который вы контролируете в контексте, немного проще в работе, учитывая четкое разделение вложенных контроллеров в представлении.
источник
Я считаю, что основным преимуществом является более интуитивно понятный API, поскольку методы / свойства связаны напрямую с экземпляром контроллера, а не с объектом области. По сути, при старом подходе контроллер становится просто украшением для создания объекта области.
Вот еще немного информации по этому поводу : http://www.syntaxsuccess.com/viewarticle/551798f20c5f3f3c0ffcc9ff
источник
Из того, что я прочитал, $ scope будет удален в Angular 2.0, или, по крайней мере, как мы рассматриваем использование $ scope. Было бы неплохо начать использовать контроллер по мере приближения выпуска 2.0.
Ссылка на видео здесь для более подробного обсуждения этого.
источник