2013-03-31 22 views
15

gram z angularjs, ale dostaję komunikat o błędzie: Argument 'Controller' is not a function, got undefined Oto JSFiddle i HTML kod:... Argument nie jest funkcją, ale niezdefiniowane

<h2>Hata's Tree-Like Set</h2> 
<div ng-app ng-init="N=3;" ng-controller="Controller"> 
<input type="range" min="1" max="10" step="1" ng-model="N"> 
<div class="tree"></div> 
</div 

Potem zdefiniować Controller funkcja w JavaScript, która nie jest rejestrowana z jakiegoś powodu.

function Controller($scope){ 
$scope.$watch("N", function(){ ... });} 
+1

Możesz dowiedzieć się problem, o tej listy: http://stackoverflow.com/a/26797874/ 930170 –

Odpowiedz

4

Można zdefiniować kontroler i zarejestrować go w jednym kroku:

angular.module('myModule').controller('MyCtrl', function($scope) { 
    $scope.$watch .... 
}); 

Jeśli chcesz kod pracować poprawnie po to zostało minified, trzeba wyraźnie określić zależność od $ zakresie:

angular.module('myModule').controller('MyCtrl', ['$scope', function(s) { 
    // you can now name the $scope argument whatever you want 
    ... 
}]); 
+0

Nie tak nie można – andygoestohollywood

+0

Nie robi dla mnie żadnej różnicy. – rainabba

5

W opcji swojej skrzypce, wybrać, aby wykonać swoją javasctipt onLoad. Z opcją onLoad JavaScript dodaje funkcję window.onLoad:

window.onload=function(){ 
     function Controller($scope){ 
      ... 
     } 
    } 

Więc kątowa nie może uzyskać dostępu do kodu, ponieważ jest w zamknięciu.

Za pomocą opcji no wrap kod jest bezpośrednio dodawany na stronie i jest dostępny pod kątem: JSFiddle.

Możesz przeglądać źródło, aby zobaczyć, jak działa.

+0

suwak ma kontrolować złożoność gałązki, w zasadzie wartość 'N' w pętli for –

+0

Proszę wyjaśnić opcję' no wrap', o której wspomniałeś. W tej odpowiedzi brakuje jakiegoś kontekstu, który sprawia, że ​​jest mniej przydatna niż mogłaby być. –

+1

tylko po to, aby wyjaśnić - opcja 'no wrap' jest w obrębie jsfiddle, nie jest kanciasta (można ją zobaczyć na pasku kontrolnym po lewej). Usunięcie tego usuwa zamknięcie, które jest przyczyną problemów z OP. Aby uzyskać więcej informacji na temat zamknięć: http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – lnrbob

12

Miałem dokładnie ten sam błąd: argument 'HelloCtrl' is not a function, ale nieokreślony.

Okazało się, że miałem błąd składniowy w moim pliku hello.js ... brakujący przecinek w definicji tablicy, wewnątrz HelloCtrl().

Dodałem przecinek, a następnie wszystko zaczęło działać!

Mam nadzieję, że to pomoże.

+4

nie, nie wiemy, gdzie powinien znajdować się przecinek. proszę podać przykład: –

+5

To, co mówi, "może być gdziekolwiek, a nic, nawet konsola przeglądarki, nie powie, gdzie". Musisz po prostu przejść przez swoją koję z drobnym zębatym grzebieniem. Pomaga, jeśli pamiętasz, kiedy ostatnio się zmieniłeś lub masz wersję kopii zapasowej, z którą możesz porównać. Dostaję ten błąd dość często i dla mnie zawsze był on spowodowany niedopasowanymi nawiasami. YMMV. – Mawg

+0

Dla tego, co jest warte, właśnie wyśledziłem mój ostatni taki błąd na problem z tablicą. Musiałem skomentować ogromny blok kodu napisany ostatniej północy i odkomentować go po trochu. Miałem 'myData.push (val: i);' zamiast '$ scope.myData.push ({val: i});' '- mssing' $ scope' oraz brakujące nawiasy klamrowe. Oczywiście oznacza to, że mój kontroler nie jest funkcją ;-) Istnieje prosty sposób na rozwiązanie tego błędu. – Mawg

7

Miałem ten sam błąd ... Argument „RadioController” nie jest funkcją ...

miałem odwołuje kontroler złego w HTML. Miałem

data-ng-controller="RadioController" 

kiedy to powinna być

data-ng-controller="Radio.RadioController" 

('Radio' jest moduł Kontroler był w)

0

musiałem zmienić kolejność tagów skryptu. Ustawiam kontroler wyżej niż na innym, od którego zależy.

zajęło mi kilka godzin, mam nadzieję, że to pomoże komuś

4

miałem trudności z tym, jak również. Przyczyną mojego problemu było to, że miałem starą wersję Angular, która nie obsługiwała nowego aliasingu as.

Upewnij się, że masz najnowszą wersję Angular, która obsługuje as.

+0

To rozwiązało mój problem, dzięki! – steffcarrington

0

Miałem ten błąd - źle postąpiłem w imieniu mojego kontrolera.

Został zarejestrowany jako CallbacksController ... zabrał mi pięć minut przekleństwa, aby zauważyć różnicę w wielkości liter (wskazówka - w moim przypadku B)!

1

Czy skonfigurowałeś poprawnie kontroler $ ControllerProvider?

Z documentation:

Name of a constructor function registered with the current $controllerProvider or an expression that on the current scope evaluates to a constructor function.

The controller instance can be published into a scope property by specifying ng-controller="as propertyName".

If the current $controllerProvider is configured to use globals (via $controllerProvider.allowGlobals()), this may also be the name of a globally accessible constructor function (not recommended).

1

Cóż, udało mi się rozwiązać ten problem przez obniżenie do starszych kątowych JS (1.2.27).

Ta sama składnia (użyta powyżej) do definiowania kontrolera i kąta JS (1.3.2) jest kombinacją, która spowodowała ten błąd.

W kanciastych (1.3.2), następująca składnia pracował dla mnie.

var app = angular.module('dummyApp', []); 

app.controller('helloController', function($scope){ 
    <write statements here> 
}); 
1

Nie trzeba obniżać wersji do starszych wersji. Można użyć metody jako metody lub metody angular.module.

Kolejność wczytywania plików musi być poprawna.

(Rozważ wymagają js jeśli masz trudności z zapamiętaniem kolejności ładowania plików)

Powiązane problemy