2013-10-11 16 views
5

Mam kontroler, który wydaje się być niepoprawny. Usunąłem wszystkie inne kod, który działa, aby ten krótki:Obiekt nie jest funkcją w AngularJS

Kontroler:

'use strict'; 

angular.module('AppliedSiteApp').controller('CarouselCtrl', function ($scope) { 

    $scope.nextImage = function() { 
     console.log('hi'); 
    } 

}); 

Widok:

<div class="carousel" ng-controller="CarouselCtrl"> 

    <ul class="nav"> 
     <li ng-click="prevImage()">&lt;</li> 
     <li ng-click="nextImage()">&gt;</li> 
    </ul> 

</div> 

każdym razem klikam przycisk w przeglądarce to mówi: "TypeError: object nie jest funkcją" lub "nie zastępuje metody". Co ja robię źle?

+2

Czy zdefiniowano prevImage()? Klikasz przycisk prevImage()? – chubbsondubs

+0

Czy kiedykolwiek znalazłeś odpowiedź na to pytanie? Mam sprawę z tym samym wyjściem, ale tylko po pierwszym kliknięciu, które działa dobrze. –

+0

Użyłem funkcji, która jest zarezerwowana .. '$ scope.register = fun ...' nie zadziała. –

Odpowiedz

1

Podczas tworzenia nowego modułu należy podać drugi parametr (jego zależności). Jeśli go nie masz, po prostu przekaż pustą tablicę.

angular.module('AppliedSiteApp', [])... 

Twój Przykładem może uzyskać dostęp do istniejący moduł (wtedy nie podasz drugiego argumentu), ale wtedy nie ma chyba jakiś kod brakuje do wykrycia błędu (lub jestem po prostu ślepy).

+0

To sprawia, że ​​kontroler jest teraz zwracany jako niezdefiniowany. W każdym razie dzięki. – JohnRobertPett

+0

Spróbuj porównać swój kod z tym przykładem: http://plnkr.co/edit/igQ93Kt0SFkfJMvBRekY?p=preview – Martin

0

wypróbować następującą definicję kontrolera

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

function CarouselCtrl($scope) { 

    $scope.nextImage = function() { 
     console.log('hi'); 
    } 
} 
+0

Niezbyt pewny, jak chcesz, abym zaimplementował ten kod. Czy możesz dać mi szturchnięcie we właściwym kierunku? – JohnRobertPett

+0

Usuń cały kod kontrolera. i wpisz to, co zostało napisane powyżej. –

+0

w tym "użyj ścisłego" –

3

Coś jest nie tak z okazji jesteś okablowanie rzeczy wierzę. Zwykle używam tego rusztowania:

angular.module('AppliedSiteApp.controllers', []). 
    controller('CarouselCtrl', ['$scope', function($scope) { 
    $scope.nextImage = function() { 
     console.log('hi'); 
    } 
    }]); 

Pierwszym argumentem controller jest nazwą, a drugi jest tablicą. W tablicy definiujesz, jakie usługi wprowadzasz do kontrolera, a następnie definiujesz funkcję zwrotną z wprowadzonymi usługami jako parametrami.

0

Zgadzam się z innymi odpowiedziami, że to problem z okablowaniem. Spróbuj tego skrzypce jako przykład: http://jsfiddle.net/reblace/7fVQR/

Deklarują swoją zewnętrzną div tak:

<div ng-app="app" ng-controller="MainController"> 

A potem kontrolera takiego:

var app = angular.module('app', []); 
function MainController($scope) { ... } 
+0

Próbowałem tego i to nie działa dla mnie. Używam również generatora Angulara, dla Yeomana, i nie jest tak, jak tworzy moduły, które wydają się łamać wszystko inne. – JohnRobertPett

+0

Sposób, w jaki to robię w tym przykładzie, działa tylko wtedy, gdy jest samodzielny (np. W JSFiddle). Twoje podejście do łączenia widoku częściowego z funkcją zwrotną funkcji zakresu jest w porządku. Ale coś jest nie tak z okablowaniem między częściowym a kontrolerem. Pierwotne pytanie nie zawiera wystarczająco dużo informacji, aby wyizolować problem. Możesz zacząć od nowa i zweryfikować, czy możesz uzyskać "Hello World", korzystając z posiadanej konfiguracji. – reblace

11

Czy nadal problem z tym?

Wpadłem na ten sam problem. Problemem dla mnie było to, że nazwa funkcji w kontrolerze i widoku była taka sama jak nazwa, której używałam w tym samym widoku.

Zmiana nazwy formularza lub nazwy funkcji naprawiła dla mnie błąd.

+0

Dzięki za odpowiedź. Jeśli dobrze pamiętam, miało to związek z problemem nazewnictwa. Moja wina! – JohnRobertPett