2013-04-22 14 views
14

ja próbuje zrobić moja aplikacja zbierać dane przed zmianą trasy, jak pokazano na wielu filmie Johna Lindquist: http://www.youtube.com/watch?v=P6KITGRQujQ&list=UUKW92i7iQFuNILqQOUOCrFw&index=4&feature=plcpangularjs odroczyć błąd: Argument „fn” nie jest funkcją, dostał Object

I to wszystko podłączyć, ale kiedy nadszedł czas na odroczony przedmiot rozwiązać, otrzymuję błąd:

Error: Argument 'fn' is not a function, got Object 
at assertArg (http://localhost:9000/components/angular/angular.js:1019:11) 
at assertArgFn (http://localhost:9000/components/angular/angular.js:1029:3) 
at annotate (http://localhost:9000/components/angular/angular.js:2350:5) 
at invoke (http://localhost:9000/components/angular/angular.js:2833:21) 
at Object.instantiate (http://localhost:9000/components/angular/angular.js:2874:23) 
at http://localhost:9000/components/angular/angular.js:4759:24 
at <error: illegal access> 
at Object.Scope.$broadcast (http://localhost:9000/components/angular/angular.js:8261:28) 
at http://localhost:9000/components/angular/angular.js:7417:26 
at wrappedCallback (http://localhost:9000/components/angular/angular.js:6797:59) angular.js:5704 

Mój kod wygląda następująco:

Route -

angular.module('saApp') 
.config(function ($routeProvider, $locationProvider) { 
    $routeProvider 
     .when('/dashboard', { 
      templateUrl: 'views/dashboard/dashboard.html', 
      controller: Dashboard, 
      resolve: Dashboard.resolve 
     } 
}); 

kontroler -

var Dashboard = angular.module('saApp').controller(
    function ($scope, dataset) { 
      $scope.data = dataset; 
    }); 

Dashboard.resolve = { 
    dataset: function ($q, DBFactory) { 

    console.log("dataset enter") 
    var deferred = $q.defer(); 

    DBFactory.get({noun: "dashboard"}, 
     function (data) { 
      console.log("resolving"); 
      deferred.resolve(data); 
     }); 

    console.log("promise"); 
    return deferred.promise; 
    } 
} 

Na metę, to wykonuje determinację, zasób DBFactory idzie, wraca i wszystko działa aż do rzeczywistego „deferred.resolve (dane);” gdzie wtedy otrzymuję błąd wklejony powyżej. Jeśli skomentuję ten jeden wiersz, oczywiście nie otrzymuję strony, ale też nie otrzymuję błędu.

Zawartość danych, wracająca z DBFactory to obiekt JSON, który jest oczekiwany i wyświetlany we wszystkich przykładach, w których widziałem online i wideo.

używając:

AngularJS 1.0.6 

myśli? Dzięki za twoją pomoc.

UPDATE:

Wydaje drogę używałem moich tras i definiowanie kontrolera z nazw:

var Dashboard = angular.module('saApp').controller() 

było winić za to. Kiedy po prostu używam standardowej deklaracji funkcji:

function DashboardCtrl($scope, dataset) { 
    $scope.data = dataset; 
} 

zadowala błąd "szukam funkcji, otrzymałem obiekt". Dziwną rzeczą było to, że zmieniłem ją na używanie go jako obiektu "var DashboardCtrl = angular.module ('saApp'). Controller()" lub nawet tego, co miałem wcześniej przed generatorem yomanów i określonymi w dokumentach angularjs od:

angular.module('saApp') 
.controller('DashboardCtrl', function ($scope, dataset) {}); 

z trasy:

.when('/dashboard', { 
      templateUrl: 'views/dashboard/dashboard.html', 
      controller: 'DashboardCtrl' 
     }) 

nie będzie działać.

+0

próbowałeś używając kątowego 1.0.5 –

+0

właśnie go wypuściłeś, ten sam błąd –

+0

Utknąłem na tym też! Chcę odwołać się do metody kontrolera we właściwości route.resolve w drugim argumencie $ routeProvider.when(). Jak mogę zrobić, gdy używam stylu modułu definicji kontrolera? (także przy użyciu języka) Utknąłem! – deck

Odpowiedz

2

Miałem ten sam problem. Możesz go rozwiązać, wykonując następujące czynności:

Usuń deklarację kontrolera z metody route .when() . Więc to ...

.when('/dashboard', { 
     templateUrl: 'views/dashboard/dashboard.html', 
     controller: Dashboard, 
     resolve: Dashboard.resolve 
    } 

staje się właśnie to ...

.when('/dashboard', { 
     templateUrl: 'views/dashboard/dashboard.html', 
     resolve: Dashboard.resolve 
    } 

teraz, aby utrzymać swój zakres, dodać deklarację kontrolera w szablonie html. Na przykład..

<div ng-controller="DashboardCtrl">{{Some fancy dashboard stuff}}</div> 
4

ta zwraca obiekt kontrolera:

var myCtrl = myApp.controller('whatever'... 

Ale trasa chce rzeczywistą funkcję kontrolera. Tak .... zakładając, że jest to kontroler i rozwiązać: (zauważ nazwałem kontroler „IndexCtrl” ... nie sądzę robisz, że w kodzie)

myApp = angular.module('myApp') 

var IndexCtrl = myApp.controller('IndexCtrl', function($scope){ 
    .. blah blah... 
}) 
IndexCtrl.resolve = { 
    loadData:function(){ ... blah blah... } 
} 

Można Mają kanciasty spojrzeć w górę kontroler, przekazując nazwę. (zauważ, że odniesienie do kontrolera jest ciągiem znaków)

.when('/',{controller:'IndexCtrl', resolve:IndexCtrl.resolve}) 
8

Miałem ten błąd wiele razy i wreszcie znalazłem idealne i proste rozwiązanie. Wystarczy umieścić swoje nazwisko kontrolera w „kiedy” Budowa w cudzysłów tak:

.when('/dashboard', { 
    templateUrl: 'views/dashboard/dashboard.html', 
    controller: 'Dashboard', 
    resolve: Dashboard.resolve 
} 

zamiast

.when('/dashboard', { 
    templateUrl: 'views/dashboard/dashboard.html', 
    controller: Dashboard, 
    resolve: Dashboard.resolve 
} 
4

również zdarzyć, jeśli przypadkowo zawierać dodatkowy nawias, gdy odwołuje się w swojej fabryce:

BAD:

myModule.factory('monkey', ['$http', MonkeyFactory()]); 

GOOD:

myModule.factory('monkey', ['$http', MonkeyFactory]); 
+0

To nie było dokładnie to dla mnie - całkowicie odrzuciłem "MonkeyFactory", ale to pozwoliło mi spojrzeć na właściwą ścieżkę. – Danny

1

Tak samo będzie, jeśli używasz Coffescript + angularjs.

Ponieważ angularjs obsługuje klasy Coffescript.

class IndexCtrl 
    constructor:() -> 

myApp.controller('IndexCtrl',IndexCtrl) 

następnie w .Przy()

na 'sterownik: IndexCtrl' widzi obiekt, nie jest funkcją.

2

Lub jeśli przez pomyłkę dokonano wstrzyknięcia po nazwie fabryki/kontrolera w ten sposób (Zła droga);

angular.module('MyModule') 
    .factory('MyFactory', 'AnotherFactory', ['$http', function($http, AnotherFactory){ 
     // CODE HERE 
    }]); 

Właściwy sposób;

angular.module('MyModule') 
    .factory('MyFactory', ['$http', 'AnotherFactory', function($http, AnotherFactory){ 
     // CODE HERE 
    }]); 
2

Dostałem ten błąd podczas kpiącego modułu z Karmą w Coffeescriptu.

Rozwiązaniem było dodanie "return null" na końcu funkcji ($ provide) ->. Bez tego coffeescript zwróci wynik funkcji $ provide.value(), który, jak sądzę, jest obiektem, który w jakiś sposób powoduje, że "fn nie jest funkcją".

Przykład:

module 'myModule', ($provide)-> 
    $provide.value 'myInjectable', 
    myFunction:-> return "dummy value" 
    return null # prevents "fn is not a function" 
2

udało mi się rozwiązać ten problem „fn nie jest funkcją, dostał obiekt” importując moje „funkcja” z innego pliku, dodając {} tak:

import {MenuCtrl} from './controllers/MenuCtrl.js'; 

stary sposób:

import MenuCtrl from './controllers/MenuCtrl.js'; 

Referenced ten problem: https://github.com/swimlane/angular-data-table/issues/189

Powiązane problemy