Оставляя директивы в стороне, мы можем и действительно назначаем контроллеры, как правило, где-то посередине представления, просто чтобы изменить конкретный кусок HTML с некоторым состоянием или поведением. Вы можете сделать это на любом уровне, даже на самом верхнем уровне. Вид и контроллер плотно соединены вместе.
По какой причине вы можете назначить контроллер на уровне маршрута? Я никогда не понимал этого, какова философия этого? Какова дополнительная польза от назначения контроллера за пределами представления, а не в верхней части самого представления. Разумеется, не возможность переключения контроллера на другую реализацию; Я этого никогда не видел.
/edit: возможно, это необходимо для того, чтобы сделать ручное решение, которое вводится? (См. Пример Джона Папы)
Я уверен, что есть другие веские причины, по которым есть возможность определить контроллер для маршрута, но я думаю, что это довольно большой. Подумайте об этом сценарии:
Если вы используете 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()
}
})
$onInit
существует для компонентов.