Zauważyłem, że to samo pytanie zostało tutaj zadane kilka razy, próbowałem je rozwiązać, ale nic nie pomaga.
Śledzę ten samouczek z filmami z jajami.
Ale kiedy dostaję się do sekcji Kontrolery i udostępnianie danych między kontrolerami, nie mogę zmusić go do pracy.
Kiedy uruchamiam go z Chrome, pojawia się ten błąd w konsoli:
„argument„ FirstCtrl ”nie jest funkcją, został niezdefiniowany”.
Naprawdę nie wiem, co się stało. Kod jest taki sam jak w samouczku.
HTML
<!DOCTYPE html>
<html ng-app>
<head>
<title>AngularJS Tutorials: Controllers</title>
<link rel="stylesheet" href="mystyle.css">
<script src="http://code.angularjs.org/1.2.0-rc.2/angular.min.js"></script>
</head>
<body>
<div ng-app="">
<div ng-controller="FirstCtrl">
<h1> {{data.message + " world"}}</h1>
<div class="{{data.message}}">
Wrap me in a foundation component
</div>
</div>
</div>
<script type="text/javascript" src="main.js"></script>
</body>
</html>
main.js
function FirstCtrl($scope){
$scope.data = { message: "Hello" };
}
javascript
angularjs
Pumba
źródło
źródło
Odpowiedzi:
Masz dwie nienazwane
ng-app
dyrektywy w swoim html.Strać ten w swoim div.
Aktualizacja
Wypróbujmy inne podejście.
Zdefiniuj moduł w pliku js i przypisz
ng-app
do niego dyrektywę. Następnie zdefiniuj kontroler jako komponent ng, a nie jako prostą funkcję:<div ng-app="myAppName"> <!-- or what's the root node of your angular app -->
a część js:
angular.module('myAppName', []) .controller('FirstCtrl', function($scope) { $scope.data = {message: 'Hello'}; });
Oto demo online, które właśnie to robi: http://jsfiddle.net/FssbL/1/
źródło
Otrzymałem dokładnie ten sam komunikat o błędzie iw moim przypadku okazało się, że nie wymieniłem pliku JS kontrolera (np. First-ctrl.js) w moim index.html
źródło
Właśnie zrobiłem ten samouczek i podążałem za odpowiedzią @ gion_13. Nadal nie działa. Rozwiązałem to, czyniąc moją nazwę ng-app w indeksie identyczną z tą w moim pliku js. Dokładnie identyczne, nawet cytaty. Więc:
<div ng-app="myapp"> <div ng-controller="FirstCtrl">
i js:
angular.module("myapp", []) .controller('FirstCtrl',function($scope) { $scope.data= {message:"hello"}; });
Dziwne, że aplikacja ng musi być identyczna, a kontroler ng nie.
źródło
Musisz nazwać swoją
ng-app
, nadając aplikacji przestrzeń nazw; samo użycieng-app
nie wystarczy .Zamiast:
Zamiast tego będziesz potrzebować czegoś takiego:
<html ng-app="app"> ...
Następnie tak:
var app = angular.module("app", []).controller("ActionsController", function($scope){});
źródło
Kolejny fajny: przypadkowo przedefiniowanie modułów. Kopiowałem / wklejałem trochę zbyt chętnie wcześniej dzisiaj i skończyło się na tym, że mam gdzieś definicję modułu, którą zastąpiłem definicjami kontrolera:
// controllers.js - dependencies in one place, perfectly fine angular.module('my.controllers', [/* dependencies */]);
Następnie w moich definicjach miałem się do tego odnieść w ten sposób:
// SomeCtrl.js - grab the module, add the controller angular.module('my.controllers') .controller('SomeCtrl', function() { /* ... */ });
Co ja zrobiłem , a nie było:
// Do not try this at home! // SomeCtrl.js angular.module('my.controllers', []) // <-- redefined module, no harm done yet .controller('SomeCtrl', function() { /* ... */ }); // SomeOtherCtrl.js angular.module('my.controllers', []) // <-- redefined module - SomeCtrl no longer accessible .controller('SomeOtherCtrl', function() { /* ... */ });
Zwróć uwagę na dodatkowy nawias w wywołaniu
angular.module
.źródło
usuń ng-app = "" z
<div ng-app="">
i po prostu zrób to
źródło
Ja też stanąłem przed tym samym problemem. Ale problem polegał na tym, że zapomniałem wymienić moduł na liście modułów, od których zależy ng-app.
źródło
Napotkałem ten problem i naprawiłem go w następujący sposób:
najpierw usuń ng-app z:
dodaj nazwę ng-app do myApp:
<div ng-app="myApp">
dodaj tę linię kodu przed funkcją:
angular.module('myApp', []).controller('FirstCtrl',FirstCtrl);
ostateczny wygląd scenariusza:
angular.module('myApp', []).controller('FirstCtrl',FirstCtrl); function FirstCtrl($scope){ $scope.data = {message: "Hello"}; }
źródło
W moim przypadku ta wiadomość pochodzi z zapomnianego wstrzyknięcia zależności w głównym module
źródło
Może się tak zdarzyć, jeśli łyk źle skonfigurowałeś, aby dodać kod aplikacji kątowej więcej niż raz. W moim przypadku było to w index.js i dodawało go jako część katalogu plików js (globbed in gulp) przed i po deklaracjach kontrolera. Po dodaniu wykluczenia dla index.js, które nie miały być zminimalizowane i wstrzyknięte po raz drugi, moja aplikacja zaczęła działać. Kolejna wskazówka, jeśli którekolwiek z powyższych rozwiązań nie rozwiązuje Twojego problemu.
źródło
Po pierwsze - jeśli nazwa modułu nie jest zdefiniowana, w JS nie będzie można uzyskać dostępu do modułu i powiązać z nim kontrolera.
Musisz podać nazwę modułu do modułu kątowego. istnieje różnica w używaniu również definiowania modułu 1. angular.module ("firstModule", []) 2. angular.module ("firstModule")
1 - należy zadeklarować nowy moduł „firstModule” bez dodania zależności w drugich argumentach. 2 - To jest użycie "firstModule", który jest zainicjowany gdzie indziej i próbujesz pobrać zainicjowany moduł i dokonać w nim modyfikacji.
źródło
Napotkałem ten problem, ale udało mi się go naprawić, zmieniając nazwę kontrolera, spróbuj go.
ctrlSub.execSummaryDocuments = function(){};
źródło
czasami coś złego w składni kodu wewnątrz funkcji powoduje ten błąd. Sprawdź swoje działanie poprawnie. W moim przypadku stało się tak, gdy próbowałem przypisać polom Json wartości i użyłem dwukropka: aby przypisać zamiast znaku równości = ...
źródło
Miałem dwa kontrolery o tej samej nazwie zdefiniowane w dwóch różnych plikach javascript. Irytujące, że angular nie może dać wyraźniejszego komunikatu o błędzie wskazującego na konflikt przestrzeni nazw.
źródło
Nie jestem pewien co do tego samouczka, ale miałem ten sam problem, gdy zapomniałem dołączyć plik do procesu minimalizacji grunt / gulp.
grunt.initConfig({ uglify: { my_target: { files: { 'dest/output.min.js': ['src/input1.js', 'src/missing_controller.js'] } } } });
Mam nadzieję, że to pomoże.
źródło
Uważaj też na wielkość liter. Spędziłem dobrą godzinę na pogoni za tym robakiem.
<section id="forgotpwd" ng-controller="ForgotPwdController">
podczas gdy ja nazywam kontrolera
angular .module('app') .controller('ForgotpwdController', ForgotpwdController);
Wszystkie powinny być konsekwentnie nazwane, w tym przypadku Forgot p wdController z małymi literami p.
źródło