Почему вы можете определить контроллер на ваших маршрутах в AngularJS?

0

Оставляя директивы в стороне, мы можем и действительно назначаем контроллеры, как правило, где-то посередине представления, просто чтобы изменить конкретный кусок HTML с некоторым состоянием или поведением. Вы можете сделать это на любом уровне, даже на самом верхнем уровне. Вид и контроллер плотно соединены вместе.

По какой причине вы можете назначить контроллер на уровне маршрута? Я никогда не понимал этого, какова философия этого? Какова дополнительная польза от назначения контроллера за пределами представления, а не в верхней части самого представления. Разумеется, не возможность переключения контроллера на другую реализацию; Я этого никогда не видел.

/edit: возможно, это необходимо для того, чтобы сделать ручное решение, которое вводится? (См. Пример Джона Папы)

  • 0
    Таким образом, вы можете повторно использовать / обменивать контроллеры, а также ваши представления (если вы используете templateUrl)
  • 0
    В прошлый раз, когда я использовал ui router, единственный способ разрешить обещание до того, как загруженный контроллер представления был через определение состояния, вы не можете сделать это в определении директивы, хотя $onInit существует для компонентов.
Показать ещё 2 комментария
Теги:

1 ответ

1

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

  • у вас есть шаблон, который вы хотите повторно использовать с различными маршрутами/состояниями
  • вы можете назначить другой контроллер шаблону на основе маршрута.

Если вы используете ng-controller в своем шаблоне, вы не можете (насколько мне известно) повторно использовать этот шаблон с другим контроллером.

При назначении контроллера по маршруту у вас больше гибкости.

стандартный подход

Я собираюсь использовать UI.Router в этом примере, как и все, с чем у меня есть опыт.

.state( 'users', {
    templateUrl: 'person.html'
    controller: 'UsersController'
})

.state( 'admin', {
    templateUrl: 'person.html'
    controller: 'AdminController'
})

Тот же шаблон, разные маршруты, с разными контроллерами.

динамический подход

Разумеется, не возможность переключения контроллера на другую реализацию

Я не буду спорить о достоинствах/недостатках этого варианта использования, но я использовал его сам один или два раза, и я видел, как он обсуждался здесь в SO и других блогах.

.state( 'entity', {
    templateUrl: 'person.html'
    controller: function( ...injectables ){
        var UserController = function(){ ... }
        var AdminController = function(){ ... }

        var ControllerClass = isAdmin ? AdminController : UserController;
        return new ControllerClass()           
    }
})

Ещё вопросы

Сообщество Overcoder
Наверх
Меню