AngularJs "контроллер как" синтаксис - разъяснение?

I читает о новом синтаксисе от angularJS относительно controller as xxx

Синтаксис InvoiceController as invoice сообщает Angular о создании экземпляра контроллер и сохранить его в переменной-счете в текущем сфера.

Визуализация:

enter image description here

Хорошо, поэтому у меня не будет параметра $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

Вопрос

Какова цель этого? удаление из одного места и добавление в другое место?

Я буду рад видеть, что мне не хватает.

Ответ 1

В этом есть несколько вещей.

Некоторым людям не нравится синтаксис $scope (не спрашивайте меня почему). Говорят, что они могут просто использовать this. Это была одна из целей.

Четкое объяснение того, откуда приходит свойство, действительно полезно.

Вы можете встраивать контроллеры, и при чтении html это довольно ясно, где все свойства приходят.

Вы также можете избежать некоторых проблем с точкой..

Например, имея два контроллера с одинаковым именем "имя", вы можете сделать это:

<body ng-controller="ParentCtrl">
    <input ng-model="name" /> {{name}}

    <div ng-controller="ChildCtrl">
        <input ng-model="name" /> {{name}} - {{$parent.name}}
    </div>
</body>

Вы можете изменить как родительский, так и дочерний, без проблем. Но вам нужно использовать $parent, чтобы увидеть родительское имя, потому что вы затеняли его в своем дочернем контроллере. В массивном html-коде $parent может быть проблематично, вы не знаете, откуда это имя.

С помощью controller as вы можете сделать:

<body ng-controller="ParentCtrl as parent">
    <input ng-model="parent.name" /> {{parent.name}}

    <div ng-controller="ChildCtrl as child">
      <input ng-model="child.name" /> {{child.name}} - {{parent.name}}
    </div>
</body>

Тот же пример, но читать его гораздо понятнее.

Ответ 2

Основным преимуществом синтаксиса controller as, который я вижу, является то, что вы можете работать с контроллерами как с классами, а не только с некоторыми функциями декодирования области и использовать преимущества наследования. Я часто сталкиваюсь с ситуацией, когда есть функциональность, которая очень похожа на несколько контроллеров, и самое очевидное, что нужно сделать, - создать класс BaseController и наследовать от него.

Несмотря на то, что существует наследование $scope, которое частично решает эту проблему, некоторые люди предпочитают писать код более чем на OOP, что, на мой взгляд, делает код более легким для объяснения и тестирования.

Вот сценарий для демонстрации: http://jsfiddle.net/HB7LU/5796/

Ответ 3

Я считаю, что одно конкретное преимущество ясно, когда у вас есть вложенные области. Теперь будет совершенно ясно, в какой области содержится ссылка на свойство.

Ответ 4

Источник

Разница между созданием контроллера с помощью $scope object и использованием синтаксиса "controller as" и vm

Создание контроллера с использованием объекта $scope

Обычно мы создаем контроллер, используя объект $scope, как показано в приведенном ниже списке:

myApp.controller("AddController", function ($scope) {



    $scope.number1;

    $scope.number2;

    $scope.result;

    $scope.add = function () {

        $scope.result = $scope.number1 + $scope.number2;

    }

});

Выше мы создаем AddController с тремя переменными и одним поведением, используя контроллер объекта и вид объекта $scope, которые говорят друг с другом. Объект $scope используется для передачи данных и поведения в представление. Он склеивает представление и контроллер вместе.

По существу объект $scope выполняет следующие задачи:

  • Передача данных с контроллера на представление

  • Передача поведения с контроллера на представление

  • Склеивает контроллер и просматривает вместе

  • Объект $scope изменяется при изменении вида и изменении вида, когда свойства объекта объекта $scope изменяются

Мы добавляем свойства объекту $scope для передачи данных и поведения в представление. Прежде чем использовать объект $scope в контроллере, нам нужно передать его в функции контроллера как зависимости.

Использование синтаксиса "контроллер как" и vm

Мы можем переписать вышеуказанный контроллер, используя контроллер как синтаксис и переменную vm, как показано в приведенном ниже списке:

myApp.controller("AddVMController", function () {

    var vm = this;

    vm.number1 = undefined;

    vm.number2=undefined;

    vm.result =undefined;

    vm.add = function () {

        vm.result = vm.number1 + vm.number2;

    }

});

По существу, мы назначаем это переменной vm, а затем присоединяем к ней свойство и поведение. В представлении мы можем получить доступ к AddVmController, используя контроллер в качестве синтаксиса. Это показано в листинге ниже:

<div ng-controller="AddVMController as vm">

            <input ng-model="vm.number1" type="number" />

            <input ng-model="vm.number2" type="number" />

            <button class="btn btn-default" ng-click="vm.add()">Add</button>

            <h3>{{vm.result}}</h3>

  </div>

Конечно, мы можем использовать другое имя, чем "vm" в контроллере в качестве синтаксиса. Под капотом AngularJS создает объект $scope и привязывает свойства и поведение. Однако, используя контроллер в качестве синтаксиса, код очень чист в контроллере, и только вид псевдонима виден в представлении.

Вот несколько способов использования контроллера в качестве синтаксиса:

  • Создайте контроллер без объекта $scope.

  • Назначьте это локальной переменной. Я предпочел имя переменной как vm, вы можете выбрать любое имя по вашему выбору.

  • Прикрепите данные и поведение к переменной vm.

  • В представлении укажите псевдоним контроллера, используя контроллер в качестве синтаксиса.

  • Вы можете указать имя псевдонима. Я предпочитаю использовать vm, если Im не работает с вложенными контроллерами.

При создании контроллера нет прямых преимуществ или недостатков использования объектного подхода $scope или контроллера в качестве синтаксиса. Это просто вопрос выбора, однако, используя контроллер, поскольку синтаксис делает код JavaScript контроллеров более читабельным и предотвращает любые проблемы, связанные с этим контекстом.

Вложенные контроллеры в объектном подходе $scope

У нас есть два контроллера, как показано в листинге ниже:

myApp.controller("ParentController", function ($scope) {



    $scope.name = "DJ";

    $scope.age = 32;

});

myApp.controller("ChildController", function ($scope) {



    $scope.age = 22;

    $scope.country = "India";



});

Свойство "возраст" находится внутри обоих контроллеров, и в представлении эти два контроллера могут быть вложены, как показано в приведенном ниже списке:

<div ng-controller="ParentController">



            <h2>Name :{{name}} </h2>

            <h3>Age:{{age}}</h3>



             <div ng-controller="ChildController">

                    <h2>Parent Name :{{name}} </h2>

                    <h3>Parent Age:{{$parent.age}}</h3>

                    <h3>Child Age:{{age}}</h3>

                    <h3>Country:{{country}}</h3>

             </div>

        </div>

Как вы видите, для доступа к возрастному свойству родительского контроллера мы используем $parent.age. Контекстное разделение здесь не очень понятно. Но используя контроллер как синтаксис, мы можем работать с вложенными контроллерами более элегантным способом. Допустим, у нас есть контроллеры, как показано в листинге ниже:

myApp.controller("ParentVMController", function () {

    var vm = this;

    vm.name = "DJ";

    vm.age = 32;

});

myApp.controller("ChildVMController", function () {

    var vm = this;

    vm.age = 22;

    vm.country = "India";



});

В представлении эти два контроллера могут быть вложены, как показано в приведенном ниже списке:

<div ng-controller="ParentVMController as parent">



            <h2>Name :{{parent.name}} </h2>

            <h3>Age:{{parent.age}}</h3>



            <div ng-controller="ChildVMController as child">

                <h2>Parent Name :{{parent.name}} </h2>

                <h3>Parent Age:{{parent.age}}</h3>

                <h3>Child Age:{{child.age}}</h3>

                <h3>Country:{{child.country}}</h3>

            </div>

 </div>

В синтаксисе контроллера у нас есть более читаемый код, а родительское свойство можно получить, используя псевдоним родительского контроллера вместо использования синтаксиса $parent.

Я завершу этот пост, сказав, что его чисто ваш выбор, хотите ли вы использовать контроллер как синтаксис или объект $scope. Нет никакого огромного преимущества или недостатка для того, чтобы просто контролировать контроллер как синтаксис, который вы контролируете в контексте, с которым легче работать, учитывая четкое разделение во вложенных контроллерах на представлении.

Ответ 5

Я нахожу, что основным преимуществом является более интуитивно понятный api, поскольку методы/свойства напрямую связаны с экземпляром контроллера, а не объектом области. В принципе, со старым подходом, контроллер становится просто украшением для создания объекта области.

Вот дополнительная информация по этому вопросу: http://www.syntaxsuccess.com/viewarticle/551798f20c5f3f3c0ffcc9ff

Ответ 6

Из того, что я прочитал, область $будет удалена в Angular 2.0 или, по крайней мере, как мы рассматриваем использование $scope. Возможно, было бы неплохо начать использовать контроллер, так как релиз 2.0 близок.

Ссылка на видео здесь для более подробного обсуждения.