Я хочу знать, как использовать несколько контроллеров для одностраничного приложения. Я попытался разобраться в этом и нашел вопросы, очень похожие на мои, но есть всего множество разных ответов, решающих конкретную проблему, когда в конечном итоге вы не используете несколько контроллеров для одностраничного приложения.
Это потому, что было бы неразумно использовать несколько контроллеров для одной страницы? Или это просто невозможно?
Скажем, у меня уже есть потрясающий контроллер карусели изображений, работающий на главной странице, но затем я узнаю, как (скажем) использовать модальные окна, и мне также нужен новый контроллер для этого (или что-то еще, что мне нужно в контроллере). Что мне тогда делать?
Я видел некоторые ответы на другие вопросы, где они спрашивают почти о тех же вещах, что и я, и люди отвечают: «* Боже, зачем тебе вообще это делать, просто сделай это ...».
Какой способ лучше или как ты это делаешь?
редактировать
Многие из вас просто объявляют два контроллера, а затем используют ng-controller для их вызова. Я использую этот фрагмент кода ниже, а затем вызываю MainCtrl с помощью ng-controller.
app.config(function($routeProvider, $locationProvider) {
$routeProvider
.when('/', {
templateUrl: "templates/main.html",
controller:'MainCtrl',
})
.otherwise({
template: 'does not exists'
});
});
Зачем мне вообще нужно устанавливать здесь контроллер, если я могу использовать ng-controller без него? Вот что меня смутило. (и вы не можете добавить два контроллера таким образом, я думаю ...)
источник
when: /home, controller: MainCtrl
. не могу добавить больше, или вы хотите просто вызвать это с помощью ng-controller?Ответы:
В чем проблема? Чтобы использовать несколько контроллеров, просто используйте несколько директив ngController:
Как обычно, вам необходимо, чтобы контроллеры были доступны в вашем модуле приложения.
Самый простой способ сделать это - объявить функции контроллера следующим образом:
источник
when /home, controller: MainCtrl
ng-controller
в нескольких элементах DOM, - это, скажем, сценарий, в котором МНОГИЕ элементы печатаются в DOM черезng-repeat
. Допустим, каждый из них обращается кng-controller="myController
. Из некоторых журналов консоли, которые я видел в своем приложении,myController
повторная инициализация с КАЖДЫМ элементом, отображаемым в DOM, который его вызывает .... Может быть, я что-то напортачил в моем конкретном использовании, или, может быть, за пределами OP вопрос, но любопытно, испытывали ли другие это вообще ....Я думаю, вам не хватает значения "одностраничное приложение".
Это не означает, что у вас физически будет один .html, вместо этого у вас будет один основной
index.html
и несколько NESTED .html файлов. Так почему же одностраничное приложение? Потому что таким образом вы не загружаете страницы стандартным способом (т.е. вызов браузера, который полностью обновляет всю страницу), а просто загружаете часть содержимого с помощью Angular / Ajax. Поскольку вы не видите мерцания между изменениями страницы, создается впечатление, что вы не двигались со страницы. Таким образом, вы чувствуете, что остаетесь на одной странице.Теперь я предполагаю, что вы хотите иметь НЕСКОЛЬКО содержимого для вашего приложения на ОДНОЙ СТРАНИЦЕ: (например) дом, контакты, портфолио и магазин. Ваше одностраничное / многостраничное приложение (угловой способ) будет организовано следующим образом:
index.html
: содержит верхний<ng-view>
и нижний колонтитулыcontacts.html
: содержит контактную форму (без заголовка, без нижнего колонтитула)portfolio.html
: содержит данные портфолио (без верхнего и нижнего колонтитула)store.html
: содержит магазин, без верхнего колонтитула.Вы находитесь в индексе, нажимаете на меню «Контакты» и что происходит? Angular заменяет
<ng-view>
тег наcontacts.html
кодКак этого добиться? with
ngRoute
, как вы это делаете, у вас будет что-то вроде:Это вызовет правильный html, передающий ему правильный контроллер (обратите внимание: не указывайте
ng-controller
директиву,contacts.html
если вы используете маршруты )Затем, конечно, вы можете объявить столько директив ng-controller на своей странице contacts.html. Это будут дочерние контроллеры
ContactCtrl
(таким образом, унаследованные от него). Но для одного маршрута внутриrouteProvider
вы можете объявить один контроллер, который будет действовать как «родительский контроллер частичного представления».ИЗМЕНИТЬ Представьте следующие шаблоны / contacts.html
приведенное выше
routeProvider
введет контроллер в ваш содержащий div. По сути, приведенный выше html автоматически становится:Когда я говорю, что у вас могут быть другие контроллеры, это означает, что вы можете подключать контроллеры к внутренним элементам DOM, как показано ниже:
Надеюсь, это немного прояснит ситуацию.
А
источник
<div ng-controller="FancyStuffController">
внутри тега body, к которому уже привязан контроллер, например,<body ng-controller="BodyController">
это сработает?$apply already in progress
Я получаю ошибки о том, когда я это делаю, но я думаю, что это связано с dpd.js. Чтобы не вдаваться в это, я думаю, что это просто загрузка его дважды или что-то в этом роде, не знаю, как, но мое использование контроллера может пытаться перезагрузить его.В настоящее время я создаю одностраничное приложение. Вот то, что у меня есть до сих пор, что, я думаю, могло бы ответить на ваш вопрос. У меня есть базовый шаблон (base.html), в котором есть div с
ng-view
директивой в нем. Эта директива сообщает angular, куда поместить новый контент. Обратите внимание, что я сам новичок в angularjs, поэтому я ни в коем случае не говорю, что это лучший способ сделать это.base.html
источник
when /home
when
х. Мне нужны два контроллера для одного шаблона. Или, детка, я неправильно понял, что ты пытался мне сказать?menuController имеет доступ к меню div. И у widgetController есть доступ к обоим.
источник
Мы можем просто объявить более одного контроллера в одном модуле. Вот пример:
источник
Я просто поместил одно простое объявление приложения
Затем я построил одну службу и два контроллера.
Для каждого контроллера у меня была строчка в JS
И в HTML я объявил область приложения в окружающем div
и каждая область контроллера отдельно в собственном окружающем div (внутри приложения div)
Это сработало нормально
источник
Вы также могли бы встроить все представления вашего шаблона в ваш основной файл HTML. Например:
Таким образом, если для каждого шаблона требуется другой контроллер, вы все равно можете использовать angular-router. См. Этот лист для рабочего примера http://plnkr.co/edit/9X0fT0Q9MlXtHVVQLhgr?p=preview
Таким образом, как только приложение отправлено с сервера вашему клиенту, оно полностью автономно, при условии, что ему не нужно делать какие-либо запросы данных и т. Д.
источник