Rozumiem, że AngularJS dwukrotnie przepuszcza jakiś kod, czasem nawet więcej, np. $watch
Zdarzenia, stale sprawdza stany modelu itp.
Jednak mój kod:
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);
});
//...
Jest wykonywany dwukrotnie, wstawiając 2 rekordy do mojej bazy danych. Najwyraźniej wciąż się uczę, ponieważ od lat uderzam w to głową!
ng-app
ręcznie i ręcznie). Sprawdź także, czy podłączyłeś kontroler do wielu elementów (za pomocą ng-kontrolera).Odpowiedzi:
Router aplikacji określił nawigację
MyController
tak:Ale miałem to również w
home.html
:To dwukrotnie przetrawiło kontroler. Usunięcie
data-ng-controller
atrybutu z HTML rozwiązało problem. Alternatywniecontroller:
właściwość mogła zostać usunięta z dyrektywy routingu.Ten problem pojawia się również podczas korzystania z nawigacji w kartach. Na przykład
app.js
może zawierać:Odpowiednia karta HTML raportów może przypominać:
Spowoduje to również dwukrotne uruchomienie kontrolera.
źródło
<div ng-view>...
na<div class="ng-view">...
ten problem, problem się zatrzymał. Nie spotkałem się wcześniej z takim zachowaniem, ale może ktoś inny też to ma.Kiedy używasz ngRoute z
ng-view
dyrektywą, kontroler domyślnie dołącza się do tego elementu dom (lub widoku interfejsu użytkownika, jeśli korzystasz z interfejsu routera). Dlatego nie będzie konieczne dołączanie go ponownie w szablonie.źródło
Właśnie to przeszedłem, ale problem był inny niż zaakceptowana odpowiedź. Naprawdę zostawiam to tutaj dla mojego przyszłego siebie, aby uwzględnić kroki, które wykonałem, aby to naprawić.
ng-ifs
ng-view
połączeń owijania (przypadkowo zostawiłem wng-view
owijaniu moich faktycznychng-view
. Spowodowało to trzy połączenia do moich kontrolerów).turbolinks
klejnot ze swojegoapplication.js
pliku. Zmarnowałem cały dzień, żeby to odkryć. Znalazłem odpowiedź tutaj .źródło
turbolinks
klejnot ze swojegoapplication.js
pliku. To doprowadzało mnie do szału, zmarnowałem cały dzień, żeby to odkryć. Prawdziwy ból. Znaleziono odpowiedź tutajPo prostu chcę dodać jeszcze jeden przypadek, gdy kontroler może zainicjować dwa razy (dotyczy to angular.js 1.3.1):
W tym przypadku $ route.current zostanie już ustawiony, gdy uruchomi się ng-view. To powoduje podwójną inicjalizację.
Aby to naprawić, po prostu zmień ng-if na ng-show / ng-hide, a wszystko będzie działać dobrze.
źródło
ui-view
dwa razy, co dwukrotnie wywoływało kontroler.Chciałbym dodać w celach informacyjnych:
Podwójne wykonanie kodu kontrolera może być również spowodowane odwołaniem się do kontrolera w dyrektywie, która również działa na stronie.
na przykład
Gdy masz również ng-controller = "myController" w swoim HTML
źródło
Podczas korzystania z routera angular -ui-router z Angular 1.3+ wystąpił problem z dwukrotnym renderowaniem widoków podczas zmiany trasy . Spowodowało to również dwukrotne uruchomienie kontrolerów. Żadne z proponowanych rozwiązań nie działało dla mnie.
Jednak aktualizacja
angular-ui-router
z 0.2.11 do 0.2.13 rozwiązała problem.źródło
Rozerwałem moją aplikację i wszystkie jej zależności na strzępy w związku z tym problemem (szczegóły tutaj: aplikacja AngularJS inicjująca się dwukrotnie (wypróbowałem zwykłe rozwiązania ..) )
I w końcu to wszystko wina wtyczki Batarang Chrome.
Rozwiązanie w tej odpowiedzi :
Zdecydowanie polecam pierwszą rzeczą na liście dowolnej osoby jest wyłączenie jej dla każdego posta przed zmianą kodu.
źródło
Jeśli wiesz, że kontroler nieumyślnie wykonuje więcej niż jeden raz, spróbuj wyszukać w swoich plikach nazwę kontrolera, który go popełnił, np .: szukaj: MyController przez wszystkie pliki. Prawdopodobnie został wklejony do innego pliku HTML / JS i zapomniałeś go zmienić, kiedy zacząłeś programować lub używać tych częściowych kontrolerów. Źródło: Popełniłem ten błąd
źródło
Miałem ten sam problem w prostej aplikacji (bez routingu i prostej referencji kontrolera ng), a konstruktor mojego kontrolera działał dwukrotnie. Wreszcie dowiedziałem się, że moim problemem była następująca deklaracja automatycznego ładowania aplikacji AngularJS w widoku Razor
Uruchomiłem go również ręcznie za pomocą angular.bootstrap tj
więc usunięcie jednego z nich zadziałało dla mnie.
źródło
W niektórych przypadkach twoja dyrektywa działa dwa razy, kiedy po prostu nie poprawiasz zamknięcia dyrektywy w następujący sposób:
<my-directive>Some content<my-directive>
Spowoduje to dwukrotne uruchomienie dyrektywy. Innym często zdarza się, że dyrektywa działa dwukrotnie:
upewnij się, że nie dołączasz swojej dyrektywy do
index.html
DWUKROTNIE !źródło
Drapałem się po tym problemie z kompilacją AngularJS 1.4 rc, a potem zdałem sobie sprawę, że żadna z powyższych odpowiedzi nie miała zastosowania, ponieważ pochodzi ona z nowej biblioteki routerów dla Angular 1.4 i Angular 2 w momencie pisania tego tekstu. Dlatego upuszczam tutaj notatkę dla każdego, kto może korzystać z nowej biblioteki tras Angular.
Zasadniczo, jeśli strona HTML zawiera
ng-viewport
dyrektywę dotyczącą ładowania części aplikacji, kliknięcie hiperłącza podanego za pomocąng-link
spowoduje, że docelowy kontroler powiązanego komponentu zostanie załadowany dwukrotnie. Subtelna różnica polega na tym, że jeśli przeglądarka załadowała już kontroler docelowy, ponowne kliknięcie tego samego hiperłącza wywołałoby kontroler tylko raz.Nie znalazłem jeszcze realnego obejścia, chociaż uważam, że takie zachowanie jest zgodne z obserwacją podniesioną przez shaunxu i mam nadzieję, że problem ten zostanie rozwiązany w przyszłej wersji nowej biblioteki tras i wraz z wydaniami AngularJS 1.4.
źródło
W moim przypadku znalazłem dwa widoki przy użyciu tego samego kontrolera.
źródło
Problem, który napotykam, może być styczny, ale skoro Google przyniósł mi to pytanie, może to być właściwe. Problem pojawia się w mojej brzydkiej głowie podczas korzystania z routera interfejsu użytkownika, ale tylko wtedy, gdy próbuję odświeżyć stronę za pomocą przycisku odświeżania przeglądarki. Aplikacja używa routera interfejsu użytkownika z nadrzędnym stanem abstrakcyjnym, a następnie podrzędnym wyłącza nadrzędny. W
run()
funkcji aplikacji jest$state.go('...child-state...')
polecenie. Stan nadrzędny używaresolve
i na początku myślałem, że może kontroler potomny wykonuje dwa razy.Wszystko jest w porządku, zanim do adresu URL zostanie dodany skrót.
www.someoldwebaddress.org
Następnie po zmodyfikowaniu adresu URL przez router interfejsu użytkownika
www.someoldwebaddress.org#/childstate
... a następnie, gdy odświeżam stronę za pomocą przycisku odświeżania przeglądarki ,
$stateChangeStart
uruchamia się dwukrotnie i za każdym razem wskazujechildstate
.Stan
resolve
nadrzędny jest uruchamiany dwukrotnie.Być może jest to kludge; niezależnie od tego, wydaje mi się, że to eliminuje problem: w obszarze kodu, który
$stateProvider
jest wywoływany po raz pierwszy , najpierw sprawdź, czy window.location.hash jest pustym ciągiem. Jeśli tak, wszystko jest dobrze; jeśli tak nie jest, ustaw window.location.hash na pusty ciąg. Wydaje się, że$state
jedyną próbą jest udać się gdzieś raz, a nie dwa razy.Ponadto, jeśli nie chcesz polegać na niewypłacalności aplikacji
run
istate.go(...)
można próbować uchwycić wartość skrótu i użyć wartości hash do określenia stanu dziecka były na krótko przed odświeżania strony i dodać warunek do obszaru w swojej kod, w którym ustawiłeśstate.go(...)
.źródło
W moim przypadku było to spowodowane użyciem wzorca adresu URL
mój adres URL był jak / ui / project /: parameter1 /: parameter2.
Nie potrzebowałem paramerter2 we wszystkich przypadkach zmiany stanu. W przypadkach, gdy nie potrzebowałem drugiego parametru, mój adres URL byłby jak / ui / project /: parameter1 /. I tak za każdym razem, gdy miałem zmianę stanu, mój kontroler będzie odświeżany dwukrotnie.
Rozwiązaniem było ustawienie parametru 2 jako pustego ciągu i dokonanie zmiany stanu.
źródło
Ta podwójna inicjalizacja nastąpiła z innego powodu. W przypadku niektórych przejść tras w mojej aplikacji chciałem wymusić przewijanie do góry strony (np. W paginowanych wynikach wyszukiwania ... kliknięcie przycisku następnego spowoduje przejście do góry strony 2).
Zrobiłem to, dodając do nas program nasłuchujący
$rootScope
$on
$viewContentLoaded
(na podstawie określonych warunków)Nieumyślnie spowodowało to ponowne oszacowanie moich tras i ponowne zainicjowanie kontrolerów
źródło
Moim problemem była aktualizacja parametrów wyszukiwania
$location.search('param', key);
możesz przeczytać więcej na ten temat tutaj
kontroler zostaje wywołany dwukrotnie z powodu dołączenia parametrów w adresie URL
źródło
W moim przypadku zmiana nazwy kontrolera na inną nazwę rozwiązała problem.
Wystąpił konflikt nazw kontrolerów z modułem „ angular -ui-tree ”: zmieniłem nazwę mojego kontrolera z „CatalogerTreeController” na „ TreeController ”, a następnie ten kontroler zaczyna być inicjowany dwukrotnie na stronie, na której użyto dyrektywy „ ui-tree ”, ponieważ ta dyrektywa używa kontrolera o nazwie „ TreeController ”.
źródło
Dla tych, którzy używają składni ControllerAs, po prostu zadeklaruj etykietę kontrolera w $ routeprovider w następujący sposób:
lub
Po zadeklarowaniu $ routeprovider, nie podawaj kontrolera jak w widoku. Zamiast tego użyj etykiety w widoku.
źródło
Miałem ten sam problem i po wypróbowaniu wszystkich odpowiedzi w końcu odkryłem, że według mnie mam dyrektywę związaną z tym samym kontrolerem.
Po usunięciu dyrektywy kontroler przestał być wywoływany dwukrotnie. Teraz moje pytanie brzmi: w jaki sposób można wykorzystać tę dyrektywę związaną z zakresem kontrolera bez tego problemu?
źródło
Właśnie rozwiązałem mój, co było dość rozczarowujące. To jonowa aplikacja hybrydowa, użyłem interfejsu użytkownika routera v0.2.13. W moim przypadku istnieje czytnik epubów (korzystający z epub.js), który stale zgłaszał komunikat „nie znaleziono dokumentu” po przejściu do biblioteki książek i wybraniu innej książki. Po ponownym załadowaniu książka przeglądarki była renderowana idealnie, ale kiedy wybrałem inną książkę, znowu ten sam problem.
Moje rozwiązanie było bardzo proste. Właśnie usunąłem
reload:true
z$state.go("app.reader", { fileName: fn, reload: true });
mojegoLibraryController
źródło
Mam ten sam problem
[email protected]
, a to dlatego, że dodatkowy ukośnik na końcu trasy wyrażenia regularnego:do
i działa poprawnie.
źródło
Dodając tutaj również moją skrzynkę:
Ja pomocą skośnych ui routerem z
$state.go('new_state', {foo: "foo@bar"})
Kiedyś dodałem encodeURIComponent do parametru problem zniknął:
$state.go('new_state', {foo: encodeURIComponent("foo@bar")})
.Co się stało? Znak „@” w wartości parametru jest niedozwolony w adresach URL. W związku z tym router kątowy ui-router utworzył mój kontroler dwukrotnie: podczas pierwszego tworzenia przekazał oryginalny „foo @ bar”, podczas drugiego tworzenia przekazał zakodowaną wersję „foo% 40bar”. Po jawnym zakodowaniu parametru, jak pokazano powyżej, problem zniknął.
źródło
Zrozumiałem, że mój jest wywoływany dwa razy, ponieważ dzwoniłem do tej metody dwa razy z mojego HTML.
Podświetlona sekcja spowodowała dwukrotne wywołanie findX (). Mam nadzieję, że to komuś pomoże.
źródło