interval javascript angularjs runtime-error promise deferred

javascript - interval - ng-repeat



Error de aplazamiento de AngularJS: el argumento ''fn'' no es una funciĆ³n, tiene un objeto (8)

Estoy intentando que mi aplicación recopile los datos antes de cambiar la ruta, como se muestra en muchos videos de John Lindquist: http://www.youtube.com/watch?v=P6KITGRQujQ&list=UUKW92i7iQFuNILqQOUOCrFw&index=4&feature=plcp

Lo tengo todo conectado, pero cuando llega el momento de que se resuelva el objeto diferido, aparece el error:

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

Mi código se ve así:

Ruta -

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

controlador -

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; } }

En la ejecución, ejecuta la resolución, el recurso DBFactory se va, vuelve y todo funciona hasta que el actual "deferred.resolve (data);" que es donde entonces obtengo el error pegado arriba. Si comento esa línea, claro, no obtengo ninguna página, pero tampoco recibo ningún error.

El contenido de los datos, que viene de DBFactory es un objeto JSON, que es lo que se espera, y se muestra en todos los ejemplos que he visto en línea y en los videos.

utilizando:

AngularJS 1.0.6

¿Pensamientos? Gracias por toda tu ayuda.

ACTUALIZAR:

Parece la forma en que estaba usando mis rutas y definiendo el controlador con el espacio de nombres:

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

era el culpable de esto. Cuando simplemente uso una declaración de función estándar:

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

satisface el error "buscando función, tengo objeto". Lo extraño fue que cambié a usarlo como un objeto "var DashboardCtrl = angular.module (''saApp''). Controller ()" o incluso lo que tenía antes del generador de yeoman, y se especificó en los documentos de angularjs. de:

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

con una ruta de:

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

no funcionaria


Esto devuelve el objeto controlador:

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

Pero la ruta quiere la función de controlador real. Entonces ... asumiendo que este es su controlador y resuelva: (aviso que nombré al controlador ''IndexCtrl'' ... no creo que lo estuviera haciendo en su código)

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

Puede tener una vista angular del controlador pasando el nombre. (note que la referencia del controlador es una cadena)

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


Esto también sucederá si está utilizando Coffescript + angularjs.

Desde angularjs soporta clases de coffescript.

class IndexCtrl constructor: () -> myApp.controller(''IndexCtrl'',IndexCtrl)

entonces en el .when ()

el ''controlador: IndexCtrl'' ve un Objeto, no una función.


O si por error hizo la inyección después del nombre de la fábrica / controlador de esta manera (de manera incorrecta);

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

La manera correcta;

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


Pude resolver este "fn no es una función, tengo un objeto" al importar mi "función" de otro archivo agregando {} de esta manera:

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

vieja forma:

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

Se hizo referencia a este problema: https://github.com/swimlane/angular-data-table/issues/189


Recibí este error mientras hacía burla de módulo con Karma en Coffeescript.

La solución fue agregar "return null" al final de la función ($ proporcionar) ->. Sin eso, coffeescript devolverá el resultado de $ proporcionando.valor (), que supongo que es un objeto, que de alguna manera provoca que "''fn no sea una función".

Ejemplo:

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


También sucederá si accidentalmente incluye paréntesis adicional al vincular en su fábrica:

MALO:

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

BUENO:

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


Tuve el mismo problema. Puedes resolverlo haciendo lo siguiente ...

Elimine la declaración del controlador de las rutas .when () método. Así que esto...

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

se convierte en esto ...

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

Ahora para mantener su alcance, agregue la declaración del controlador en su plantilla html. Por ejemplo..

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


Tuve este error muchas veces y finalmente encontré la solución perfecta y simple. Solo ponga el nombre de su controlador en la construcción ''cuando'' en comillas como esta:

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

en lugar de

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