Я понимаю, что AngularJS проходит через некоторый код дважды, иногда даже больше, например, $watch
события, постоянная проверка состояний модели и т. Д.
Однако мой код:
function MyController($scope, User, local) {
var $scope.User = local.get(); // Get locally save user data
User.get({ id: $scope.User._id.$oid }, function(user) {
$scope.User = new User(user);
local.save($scope.User);
});
//...
Выполняется дважды, вставляя 2 записи в мою БД. Я, очевидно, все еще учусь, поскольку я бился головой об этом целую вечность!
ng-app
помощью ручной загрузки). Также проверьте, подключен ли ваш контроллер к нескольким элементам (с помощью ng-controller).Ответы:
Маршрутизатор приложения указал навигацию
MyController
так:Но у меня также было это в
home.html
:Это переварило контроллер дважды. Удаление
data-ng-controller
атрибута из HTML решило проблему. В качестве альтернативы,controller:
свойство могло быть удалено из директивы маршрутизации.Эта проблема также появляется при использовании навигации по вкладкам. Например,
app.js
может содержать:Соответствующая вкладка отчетов HTML может выглядеть следующим образом:
Это также приведет к запуску контроллера дважды.
источник
<div ng-view>...
на<div class="ng-view">...
эту проблему, эта проблема для меня прекращается. Я не сталкивался с таким поведением раньше, но, возможно, кто-то еще имеет это.Когда вы используете ngRoute с
ng-view
директивой, контроллер подключается к этому элементу dom по умолчанию (или ui-view, если вы используете ui-router). Таким образом, вам не нужно будет прикреплять его снова в шаблоне.источник
Я только что прошел через это, но проблема отличалась от принятого ответа. Я действительно оставляю это здесь для своего будущего себя, чтобы включить шаги, которые я прошел, чтобы исправить это.
ng-ifs
ng-view
вызовы обёртывания (я случайно ушел вng-view
обертку, которая оборачивала мой фактический результатng-view
. Это привело к трем вызовам для моих контроллеров.)turbolinks
гем из вашегоapplication.js
файла. Я потратил впустую целый день, чтобы обнаружить это. Нашел ответ здесь .источник
turbolinks
gem из вашегоapplication.js
файла. Это сделало меня сумасшедшим, потратил впустую целый день, чтобы обнаружить это Настоящая боль. Нашел ответ здесьПросто хочу добавить еще один случай, когда контроллер может инициировать дважды (это актуально для angular.js 1.3.1):
В этом случае $ route.current будет уже установлен при запуске ng-view. Это вызывает двойную инициализацию.
Чтобы это исправить, просто измените ng-if на ng-show / ng-hide, и все будет работать хорошо.
источник
ui-view
дважды, который дважды вызывал контроллер.Хотел бы добавить для справки:
Двойное выполнение кода контроллера также может быть вызвано ссылкой на контроллер в директиве, которая также выполняется на странице.
например
Когда у вас также есть ng-controller = "myController" в вашем HTML
источник
При использовании angular-ui-router с Angular 1.3+ возникла проблема с рендерингом представлений дважды при переходе по маршруту . Это также привело к выполнению контроллеров дважды. Ни одно из предложенных решений не сработало для меня.
Однако обновление
angular-ui-router
с 0.2.11 до 0.2.13 решило проблему для меня.источник
Я порвал свое приложение и все его зависимости на кусочки по этой проблеме (подробности здесь: приложение AngularJS запускается дважды (пробовал обычные решения ..) )
И в конце концов, во всем виноват плагин Batarang Chrome.
Разрешение в этом ответе :
Я настоятельно рекомендую первым делом отключить его для каждого сообщения перед изменением кода.
источник
Если вы знаете, что ваш контроллер непреднамеренно выполняет более одного раза, попробуйте выполнить поиск в ваших файлах имени нарушающего контроллера, например: search: MyController по всем файлам. Скорее всего, он был вставлен в другой html / js-файл, и вы забыли изменить его, когда приступили к разработке или использованию этих партиалов / контроллеров. Источник: я сделал эту ошибку
источник
У меня была такая же проблема, в простом приложении (без маршрутизации и простой ссылки на ng-контроллер), и конструктор моего контроллера действительно запускался дважды. Наконец, я обнаружил, что моей проблемой было следующее объявление для автоматической загрузки моего приложения AngularJS в моем представлении Razor
Я также вручную загрузил его с помощью angular.bootstrap т.е.
так что убрав один из них, он сработал для меня.
источник
В некоторых случаях ваша директива запускается дважды, когда вы просто не корректно закрываете директиву следующим образом:
<my-directive>Some content<my-directive>
Это выполнит вашу директиву дважды. Также есть еще один частый случай, когда ваша директива запускается дважды:
убедитесь, что вы не включили вашу директиву в свой
index.html
ДВАЖДЫ !источник
Я ломал голову над этой проблемой со сборкой AngularJS 1.4 rc, а затем понял, что ни один из вышеперечисленных ответов не применим, поскольку он был создан из новой библиотеки маршрутизатора для Angular 1.4 и Angular 2 на момент написания этой статьи. Поэтому я оставляю здесь заметку для тех, кто может использовать новую библиотеку угловых маршрутов.
По сути, если html-страница содержит
ng-viewport
директиву для загрузки частей вашего приложения, нажатие на гиперссылку, указанную в,ng-link
приведет к двойной загрузке целевого контроллера связанного компонента. Тонкое отличие состоит в том, что, если браузер уже загрузил целевой контроллер, повторный щелчок по той же гиперссылке вызовет контроллер только один раз.Пока не нашли приемлемого обходного пути, хотя я считаю, что это поведение согласуется с наблюдением, сделанным shaunxu , и, надеюсь, эта проблема будет решена в будущей сборке новой библиотеки маршрутов и вместе с выпусками AngularJS 1.4.
источник
В моем случае я нашел два представления, использующих один и тот же контроллер.
источник
Проблема, с которой я сталкиваюсь, может быть косвенной, но поскольку поиск в Google привел меня к этому вопросу, это может быть уместно. При использовании UI Router у меня возникает проблема, но только когда я пытаюсь обновить страницу кнопкой обновления браузера. Приложение использует UI Router с родительским абстрактным состоянием, а затем дочерние состояния от родительского. В
run()
функции приложения есть$state.go('...child-state...')
команда. Родительское состояние использует aresolve
, и сначала я подумал, что, возможно, дочерний контроллер выполняется дважды.Все хорошо, пока к URL не добавлен хеш.
www.someoldwebaddress.org
Затем, как только URL был изменен UI Router,
www.someoldwebaddress.org#/childstate
... а затем, когда я обновляю страницу с помощью кнопки обновления браузера ,
$stateChangeStart
огонь срабатывает дважды, и каждый раз указывает наchildstate
.На
resolve
родительском состоянии запускается дважды.Возможно, это клудж; несмотря на это, это, кажется, устраняет проблему для меня: в области кода, где
$stateProvider
вызывается впервые, сначала проверьте, является ли window.location.hash пустой строкой. Если это так, все хорошо; если это не так, установите для window.location.hash пустую строку. Тогда кажется, что$state
единственная попытка пойти куда-то один раз, а не дважды.Кроме того , если вы не хотите , чтобы полагаться на дефолтом приложения
run
иstate.go(...)
вы можете попытаться захватить значение хеш - функции и использовать хэш - значение для определения состояния ребенка вы были непосредственно перед обновлением страницы и добавить условие к области в вашем код, где вы установитеstate.go(...)
.источник
В моем случае это было из-за шаблона URL, который я использовал
мой URL был похож на / ui / project /: параметр1 /: параметр2.
Мне не нужен paramerter2 во всех случаях изменения состояния. В тех случаях, когда мне не нужен второй параметр, мой URL будет выглядеть как / ui / project /: parameter1 /. И поэтому всякий раз, когда у меня было изменение состояния, мой контроллер обновлялся дважды.
Решением было установить параметр2 как пустую строку и выполнить изменение состояния.
источник
У меня была двойная инициализация по другой причине. Для некоторых маршрутов-переходов в моем приложении я хотел принудительно прокрутить до верхней части страницы (например, в результатах поиска с разбивкой по страницам ... нажатие кнопки «Далее» должно привести вас к началу страницы 2).
Я сделал это, добавив слушателя к
$rootScope
$on
$viewContentLoaded
которому (на основе определенных условий) выполняетсяСлучайно это привело к переоценке моих маршрутов и повторной инициализации контроллеров.
источник
Моя проблема была при обновлении параметров поиска, так
$location.search('param', key);
Вы можете прочитать больше об этом здесь
контроллер вызывается дважды из-за добавления параметров в URL
источник
В моем случае переименование контроллера на другое имя решило проблему.
Возник конфликт имен контроллеров с модулем « angular-ui-tree »: я переименовал свой контроллер из «CatalogerTreeController» в « TreeController », а затем этот контроллер дважды запускается на странице, где используется директива « ui-tree », поскольку эта директива использует контроллер с именем « TreeController ».
источник
Для тех, кто использует синтаксис ControllerAs, просто объявите метку контроллера в $ routeprovider следующим образом:
или
После объявления $ routeprovider не указывайте контроллер, как в представлении. Вместо этого используйте метку в представлении.
источник
У меня была та же проблема, и после того, как я попробовал все ответы, я, наконец, обнаружил, что у меня была директива, которая была привязана к одному контроллеру.
После удаления директивы контроллер перестал вызываться дважды. Теперь мой вопрос: как без этой проблемы использовать эту директиву, связанную с областью контроллера?
источник
Я только что решил свой, который был довольно разочаровывающим. Это ионное гибридное приложение, я использовал ui-router v0.2.13. В моем случае есть читатель epub (использующий epub.js), который постоянно сообщает «документ не найден», как только я перехожу в библиотеку книг и выбираю любую другую книгу. Когда я перезагружал браузер, книга отображалась идеально, но когда я выбирал другую книгу, снова возникала та же проблема.
Мое решение было очень простым. Я только что удалил
reload:true
из$state.go("app.reader", { fileName: fn, reload: true });
моегоLibraryController
источник
У меня та же проблема
angular-route@1.6.7
, и это из-за дополнительной косой черты в конце маршрута регулярного выражения:в
и это работает правильно.
источник
Просто добавлю сюда мой случай:
Я использовал Angular-UI-роутер с
$state.go('new_state', {foo: "foo@bar"})
После того, как я добавил encodeURIComponent к параметру, проблема исчезла:
$state.go('new_state', {foo: encodeURIComponent("foo@bar")})
.Что случилось? Символ «@» в значении параметра недопустим в URL. Как следствие, angular-ui-router создал мой контроллер дважды: во время первого создания он прошел исходный «foo @ bar», во время второго создания он передал бы закодированную версию «foo% 40bar». Как только я явно закодировал параметр, как показано выше, проблема исчезла.
источник
Я понял, что мой вызывается дважды, потому что я дважды вызывал метод из моего HTML.
Выделенный раздел вызывал вызов findX () дважды. Надеюсь, это кому-нибудь поможет.
источник