Подтвердить что ты не робот

Angularjs "Контроллер как" или "$ scope"

Я хотел бы знать, в чем основное отличие синтаксиса "Контроллер как" или "$ scope" в angularjs.

  • У них есть влияние на производительность, если да, какой синтаксис предпочтительнее.
  • Синтаксис "Контроллер как", несомненно, улучшает читабельность кода, поскольку Knockout.js и другая среда JavaScript следуют одному и тому же синтаксису.
  • $scope предоставит наследование области, которое иногда дает нам странное поведение, например

    <div ng-controller="firstController">
     ParentController: <input type="text" ng-model="parent"/>
      <div ng-controller="secondController">
        ChildController: <input type="text" ng-model="parent" />
      </div>
    </div>
    
    app.controller('ParentController', function ($scope) {
      $scope.parent = "parentScope";
    }).controller('ChildController', function ($scope) { /*empty*/ }); 
    

    a) Первоначально ребенок получит родительское свойство и отображает "parentScope", когда мы обновим родительский дочерний элемент, также получим обновление. Но если мы изменили дочернее свойство, то теперь обновление родительского элемента не изменит его, поскольку оно имеет собственное свойство области.

    b) Если я использую контроллер, так как дочерний элемент синтаксиса также обновляет родительский элемент.

4b9b3361

Ответ 1

Я написал несколько ответов на этот вопрос в прошлом, и они все сводятся к одному и тому же. В Angular вы используете $scope, даже если вы прямо не ссылаетесь на него.

Синтаксис ControllerAs позволяет Angular помочь вам создавать более эффективные отказоустойчивые контроллеры. За кулисами, когда вы используете ng-controller="theController as ctrl", Angular создает theController как свойство в $scope и назначает его как ctrl. Теперь у вас есть свойство объекта, которое вы ссылаетесь на область видимости, и автоматически защищены от проблем наследования прототипов.

С точки зрения производительности, поскольку вы все еще используете $scope, разница в производительности должна быть незначительной. Однако, поскольку ваш контроллер теперь не назначает переменные непосредственно $scope на свой собственный, ему не нужно вводить $scope. Кроме того, контроллер может быть гораздо легче протестирован изолированно, так как теперь это просто простая функция JavaScript.

С точки зрения перспективного мышления, теперь хорошо известно, что Angular 2.0 не будет иметь $scope, но вместо этого будет использовать функции ECMAScript 6. В любых предпросмотрах, выпущенных командой Angular, показывающей миграции, они сначала начните с рефакторинга контроллера, чтобы устранить $scope. Если ваш код разработан без использования контроллеров на основе $scope, ваш первый шаг в миграции уже завершен.

С точки зрения дизайнера синтаксис ControllerAs значительно упрощает работу с объектами. Имея customerCtrl.Address и storeCtrl.Address, гораздо проще идентифицировать, что у вас есть адрес, назначенный несколькими разными контроллерами для разных целей, чем если бы оба использовали $scope.Address. Наличие двух разных HTML-элементов на странице, которые оба привязаны к {{Address}}, и знание того, какой из них является только контроллером, содержащий элемент, является серьезной проблемой для устранения неполадок.

В конечном счете, если вы не пытаетесь развернуть 10-минутную демонстрацию, вам действительно нужно использовать ControllerAs для любой серьезной работы Angular.

Ответ 2

Я бы определенно рекомендовал синтаксис Controller As.

Это более чистый, более эффективный, вы можете организовать свой код намного больше, и это новый способ сделать AngularJS.

Если вы не работаете с командой, используемой для синтаксиса $scope, определенно используйте Controller As.