В чем разница между директивой ng-controller и контроллером на маршруте?

Я работал над учебником на веб-сайте AngularJS, и я заметил, что на шаге 7 они измените, как контроллер вводится в приложение. Первоначально они используют директиву:

<body ng-controller="PhoneListCtrl">
...
</body>

Однако позже он будет изменен, чтобы использовать атрибут controller как часть ng-route.

$routeProvider.
    when('/phones', {
        templateUrl: 'partials/phone-list.html',
        controller: 'PhoneListCtrl'
    }). 
    /* rest of routes here */ 

Здесь git diff, где сделано изменение. Есть ли разница между этими двумя методами?

Ответы

Ответ 1

Контроллер с помощью директивы ng-controller:

  • В элементе ng-controller создается новая $scope.
  • Явное соединение "просмотр-контроль"
  • Видимый элемент проверки и т.д.

Контроллер в маршруте:

  • Новая новая область $создается по маршруту в элементе ng-view.
  • Контроллер может запрашивать зависимости, определенные в разрешении маршрута.
  • Дополнительное соединение "просмотр-контроль". Рекомендуется иметь соглашение об именах, которое отображает маршруты к контроллерам в представления.

Ответ 2

ng-view является причиной разницы. Вы действительно не можете это сделать

<div ng-view ng-controller="PhoneListCtrl">

Как вам нужно будет изменить этот контроллер по мере изменения маршрута. Таким образом, маршрутизатор делает это для вас и использует контроллер, указанный вами при определении маршрутов.

Вы, вероятно, можете это сделать:

<div ng-view>

а затем в вашем шаблоне:

<div ng-controller="PhoneListCtrl">

и оставьте объявление контроллера в ваших маршрутах. То, что я подозреваю, будет иметь по существу тот же эффект, хотя я никогда не пробовал это. Наверное, лучше пойти с конвенцией здесь.

Ответ 3

В первом случае контроллер напрямую на странице.

Как только они меняют его, этот контроллер находится только на странице, если маршрут /phones, иначе это какой-то другой контроллер, основанный на каком-то другом маршруте.

Ответ 4

Одна из известных особенностей Angularjs - одностраничные приложения.

Если вы назначаете атрибут ng-controller непосредственно на странице:

<body ng-controller="PhoneListCtrl">
...
</body>

вы не можете легко переключать контроллеры для других задач.

Таким образом, использование маршрута для переключения контроллеров является одним из важных шагов в обучении Angular функции Single-page.

Вы можете иметь один и тот же макет и один другой элемент, используя директиву route и ng-view.

$routeProvider.
    when('/phones', {
        templateUrl: 'partials/phone-list.html',
        controller: 'PhoneListCtrl'
    }).
    when('/tablets', { 
        templateUrl: 'partials/tablet-list.html',
        controller: 'TabletListCtrl'
    }).

Если '/phones'

<div ng-view></div>

будет включен ваш шаблон "partials/phone-list.html" и установите "PhoneListCtrl" в качестве контроллера div

То же самое:

Если '/tablets'

<div ng-view></div>

будет включать ваш шаблон "partials/tablet-list.html" и установите "TabletListCtrl" в качестве контроллера div

В этом разница между двумя.

Ответ 5

Да - это изменение:

если вы хотите отобразить конкретный контроллер на странице, вы можете использовать

<body ng-controller>

НО

если вы хотите выполнить маршрутизацию (приложение с несколькими контроллерами) - вам нужно будет использовать маршрутизацию + изменить тело на:

<body ng-view></body>