Używając AngularJS ze Scala Play, otrzymuję ten błąd.
Błąd: argument „MainCtrl” nie jest funkcją, został niezdefiniowany
Próbuję stworzyć tabelę składającą się z dni tygodnia.
Spójrz na mój kod. Sprawdziłem nazwę kontrolera, ale wydaje się, że jest poprawna. Uwaga: kod użyty w tej odpowiedzi SO
index.scala.html
@(message: String)
@main("inTime") {
<!doctype html>
<html lang="en" ng-app>
<head>
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
</head>
<div ng-controller="MainCtrl">
<table border="1">
<tbody ng-repeat='(what,items) in data'>
<tr ng-repeat='item in items'>
<td ngm-if="$first" rowspan="{{items.length}}">{{what}}</td>
<td>{{item}}</td>
</tr>
</tbody>
</table>
</div>
</html>
}
MainCtrl.js
(function() {
angular.module('[myApp]', []).controller('MainCtrl', function($scope) {
$scope.data = {
Colors: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
}
});
}());
angularjs
playframework
Kevin Meredith
źródło
źródło
ng-app
ng-app=myApp
Odpowiedzi:
Usuń
[]
z nazwy ([myApp]) modułuI dodaj
ng-app="myApp"
do HTML i powinno działać.źródło
[]
oznacza, że tworzysz nowy moduł. Usunięcie drugiego parametru oznacza, że pobierasz istniejący moduł. Tak więc jedną z możliwości sprawdzenia jest to, czy dzwoniszangular.module
dwa razy, za każdym razem włączając drugi parametr. Jeśli tak, to późniejsze wystąpienie nadpisze drugie, ukrywając definicje kontrolerów do tego momentu.[]
, odnosi się do pierwszego parametru, w którym OP ma[myApp]
zamiastmyApp
. Nie mówi o drugim parametrze.PIERWSZY. sprawdź, czy masz poprawne
controller
definicje tras, takie same jak nazwy kontrolerów, które definiujeszróżne nazwy kontrolerów w tym przykładzie prowadzą do błędów, ale ten przykład jest poprawny
PO DRUGIE sprawdź, czy zaimportowałeś plik javascript:
<script src="modules/community/controllers/CommunityMembersCtrl.js"></script>
źródło
index.html
Miałem ten sam komunikat o błędzie (w moim przypadku: „Argument 'languageSelectorCtrl' nie jest funkcją, został zdefiniowany”).
Po żmudnym porównaniu z kodem zarodka Angulara dowiedziałem się, że wcześniej usunąłem odniesienie do modułu controllers w app.js. (znajdź to na https://github.com/angular/angular-seed/blob/master/app/js/app.js )
Więc miałem to:
angular.module('MyApp', ['MyApp.filters', 'MyApp.services', 'MyApp.directives'])
To się nie udało.
A kiedy dodałem brakujące odniesienie:
angular.module('MyApp', ['MyApp.filters', 'MyApp.services', 'MyApp.controllers', 'MyApp.directives'])
Komunikat o błędzie zniknął i Angular mógł ponownie zainicjować kontrolery.
źródło
Czasami ten błąd jest wynikiem dwóch
ng-app
dyrektyw określonych w html. W moim przypadku przez pomyłkę określiłemng-app
w swoimhtml
tagu ing-app="myApp"
wbody
tagu w następujący sposób:źródło
To poważnie zajęło mi 4 GODZINY (wliczając niekończące się wyszukiwania na SO), ale w końcu to znalazłem: przez pomyłkę (nieumyślnie) dodałem gdzieś spację.
Czy potrafisz to dostrzec?
angular.module('bwshopper.signup').controller('SignupCtrl ', SignupCtrl);
Więc ... 4 godziny później zobaczyłem, że powinno być:
angular.module('bwshopper.signup').controller('SignupCtrl', SignupCtrl);
Prawie niemożliwe do zobaczenia gołym okiem.
Podkreśla to kluczowe znaczenie kontroli wersji (git lub cokolwiek) oraz testów jednostkowych / regresyjnych.
źródło
Controller
zamiastcontroller
i to wystarczyło.Napotkałem ten sam problem iw moim przypadku stało się to w wyniku tego problemu:
Miałem kontrolery zdefiniowane w oddzielnym module (zwanym „myApp.controllers”) i wstrzyknięte do głównego modułu aplikacji (zwanego „myApp”) w następujący sposób:
Kolega umieścił inny moduł kontrolera w oddzielnym pliku, ale o dokładnie takiej samej nazwie jak moja (tj. „MyApp.controllers”), który spowodował ten błąd. Myślę, że ponieważ Angular pomylił te moduły kontrolera. Jednak komunikat o błędzie nie był zbyt pomocny w odkrywaniu, co się dzieje.
źródło
W moim przypadku (mając stronę przeglądu i stronę „dodaj”) otrzymałem to z moją konfiguracją routingu, jak poniżej. Podawał komunikat dla AddCtrl, którego nie można było wstrzyknąć ...
Z powodu
when('/'
trasy wszystkie moje trasy przeszły do przeglądu i nie można było dopasować kontrolera do renderowania strony / add route. To było mylące, ponieważ widziałem szablon add.html, ale nigdzie nie można było znaleźć jego kontrolera.Usunięcie trasy „/”, gdy sprawa rozwiązało ten problem.
źródło
Jeśli jesteś w module podrzędnym, nie zapomnij zadeklarować modułu w głównej aplikacji. tj .:
Jeśli nie zadeklarujesz subModule1 w mainApp, otrzymasz argument "[ng: areq]" MyController "nie jest funkcją, został zdefiniowany.
źródło
Drugim punktem Уmeda była moja pułapka, ale tak dla porządku, może to gdzieś pomaga:
Miałem ten sam problem i tuż przed tym, jak oszalałem, odkryłem, że zapomniałem dołączyć skrypt kontrolera.
Ponieważ moja aplikacja jest oparta na ASP.Net MVC, postanowiłem zachować rozsądek, wstawiając następujący fragment kodu do mojego App_Start / BundleConfig.cs
oraz w Layout.cshtml
Teraz już nigdy więcej nie będę musiał myśleć o ręcznym dołączaniu plików. Z perspektywy czasu naprawdę powinienem był to zrobić podczas przygotowywania projektu ...
źródło
Otrzymałem rozsądny błąd z LoginController, którego użyłem w głównym pliku index.html. Znalazłem dwa sposoby rozwiązania:
ustawiając $ controllerProvider.allowGlobals (), znalazłem ten komentarz w liście zmian Angular "ta opcja może być przydatna do migracji starych aplikacji, ale nie używaj jej w nowych!" oryginalny komentarz do Angular
app.config (['$ controllerProvider', function ($ controllerProvider) {$ controllerProvider.allowGlobals ();}]);
zły konstruktor rejestrującego kontrolera
przed
teraz
„app” pochodzi z pliku app.js
źródło
Miałem ten sam błąd z dużym błędem:
Zobaczysz ? zapomniałem '' wokół pierwszego zakresu $, prawidłowa składnia to oczywiście:
Pierwszy błąd, którego nie widziałem od razu, to: „ $ scope nie jest zdefiniowany ”, po którym następuje „ Błąd: [ng: areq] Argument 'TreeEditStepControlsCtrl' nie jest funkcją, jest niezdefiniowany ”
źródło
Czy mogłoby to być tak proste, jak umieszczenie aktywów w „” i cokolwiek wymaga cudzysłowu w środku z „”?
staje się
Może to powodować problemy z analizowaniem
źródło
Aby rozwiązać ten problem, musiałem odkryć, że błędnie wpisałem nazwę kontrolera w deklaracji tras Angular:
źródło
W moim przypadku była to prosta literówka w
index.html
:to powinno być
bez dodatku
s
w nazwie kontrolera.źródło
Okazuje się, że jest to pamięć podręczna przeglądarki, używając tutaj Chrome. Po prostu zaznacz opcję „Wyłącz pamięć podręczną” w obszarze Sprawdź (element), aby rozwiązać mój problem.
źródło
Ponieważ ten komunikat pojawia się w Google podczas próby znalezienia odpowiedzi na: „Błąd: Argument” nie jest funkcją, została zdefiniowana ”.
Możliwe, że próbujesz dwukrotnie utworzyć ten sam moduł.
Źródło: https://docs.angularjs.org/api/ng/function/angular.module#overview
Przykład:
angular.module('myApp', [])
Służy do tworzenia modułu bez wprowadzania żadnych zależności.angular.module('myApp')
(Bez argumentu) służy do pobrania istniejącego modułu.źródło
Wydaje się, że istnieje wiele działających rozwiązań sugerujących, że błąd ma wiele rzeczywistych przyczyn .
W moim przypadku nie zadeklarowałem administratora w
app/index.html
:Błąd zniknął.
źródło