AngularJS延迟错误:参数'fn'不是一个函数,而是一个对象
AngularJS defer error: Argument 'fn' is not a function, got Object
我试图让我的应用程序在改变路线之前收集数据,如John Lindquist的许多视频所示:http://www.youtube.com/watch?v=P6KITGRQujQ&list=UUKW92i7iQFuNILqQOUOCrFw&index=4&feature=plcp
我已经把它连接起来了,但是当延迟对象解析的时候,我得到了错误:
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
我的代码是这样的:
路由-
angular.module( 'saApp' )
.config( function ( $routeProvider, $locationProvider ) {
$routeProvider
.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
controller: Dashboard,
resolve: Dashboard.resolve
}
});
controller -
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;
}
}
在运行时,它执行解析,DBFactory资源离开,返回,一切正常工作,直到实际的"deferred.resolve(data);",这就是我得到上面粘贴的错误的地方。如果我注释掉这一行,当然我不会得到任何页面,但我也不会得到任何错误。
数据的内容,从DBFactory返回是一个JSON对象,这是我所期望的,并在我在网上和视频中看到的所有示例中显示。
使用:AngularJS 1.0.6
想法吗?谢谢你的帮助。
更新:
这似乎是我使用我的路由和定义命名空间的控制器的方式:
var Dashboard = angular.module( 'saApp' ).controller()
应该对此负责。当我简单地使用标准函数声明时:
function DashboardCtrl($scope, dataset) {
$scope.data = dataset;
}
满足"looking for function, got object"错误。奇怪的是,我把它变成了一个对象"var DashboardCtrl = angular.module('saApp').controller()",甚至是在此之前我从yeoman生成器中得到的东西,并在angularjs文档中指定:
angular.module( 'saApp' )
.controller( 'DashboardCtrl', function ( $scope, dataset ) {});
路由为:
的.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
controller: 'DashboardCtrl'
} )
不会工作。
我有这个错误很多次,终于找到了完美和简单的解决方案。只要把你的控制器名称放在'when'结构中,像这样加引号:
.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
controller: 'Dashboard',
resolve: Dashboard.resolve
}
不是.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
controller: Dashboard,
resolve: Dashboard.resolve
}
返回控制器对象:
var myCtrl = myApp.controller('whatever'...
但是route需要实际的控制器功能。所以…假设这是你的控制器和解决:(注意我命名的控制器'IndexCtrl'…我认为你没有在你的代码中这样做)
myApp = angular.module('myApp')
var IndexCtrl = myApp.controller('IndexCtrl', function($scope){
.. blah blah...
})
IndexCtrl.resolve = {
loadData:function(){ ... blah blah... }
}
你可以让angular通过传入名称来查找控制器。(注意控制器引用是一个字符串)
.when('/',{controller:'IndexCtrl', resolve:IndexCtrl.resolve})
如果在工厂中链接时不小心包含了额外的括号,也会发生
坏:
myModule.factory('monkey', ['$http', MonkeyFactory()]);
好:
myModule.factory('monkey', ['$http', MonkeyFactory]);
我也有同样的问题。您可以通过执行以下操作来解决此问题。
从路由中删除控制器声明。方法。所以这…
.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
controller: Dashboard,
resolve: Dashboard.resolve
}
变成了这个…
.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
resolve: Dashboard.resolve
}
现在,为了维护你的作用域,在你的html模板中添加控制器声明。例如. . <div ng-controller="DashboardCtrl">{{Some fancy dashboard stuff}}</div>
或者像这样错误地在工厂/控制器的名称后面进行了注入;
angular.module('MyModule')
.factory('MyFactory', 'AnotherFactory', ['$http', function($http, AnotherFactory){
// CODE HERE
}]);
正确的方式;
angular.module('MyModule')
.factory('MyFactory', ['$http', 'AnotherFactory', function($http, AnotherFactory){
// CODE HERE
}]);
我在Coffeescript中使用Karma进行模块模拟时遇到此错误。
解决方案是在($提供)->函数的末尾添加"返回null"。如果没有这个,coffeescript将返回$ provider .value()的结果,我猜这是一个对象,这在某种程度上导致"'fn不是一个函数"。
的例子:
module 'myModule', ($provide)->
$provide.value 'myInjectable',
myFunction:-> return "dummy value"
return null # prevents "fn is not a function"
我能够解决这个"fn不是一个函数,得到对象"通过添加{}从另一个文件导入我的'函数',像这样:
import {MenuCtrl} from './controllers/MenuCtrl.js';
老方法:
import MenuCtrl from './controllers/MenuCtrl.js';
参考此问题:https://github.com/swimlane/angular-data-table/issues/189
当我忘记导出我正在导入的类时,我得到了这个错误
import MyService from './services/MyService'
app.service('MyService', MyService);
MyService.js
class MyService(){
// ... do stuff
}
必须是
export default class MyService(){
// ... do stuff
}
如果你使用Coffescript + angularjs,也会发生这种情况。
因为angularjs支持Coffescript类。
class IndexCtrl
constructor: () ->
myApp.controller('IndexCtrl',IndexCtrl)
然后在当()
'controller: IndexCtrl'看到的是一个对象,而不是一个函数。
当我们在html中有一个函数没有在控制器中定义时,我们也会得到这个错误。
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 对一个对象使用reduce可以返回一个没有't在数组中包含目标字母
- AngularJS&JSON-从Previous&下一个对象
- jQuery$.inArray()总是返回-1和一个对象数组
- javascript处理一个对象数组以获得一个新的对象数组
- javascript函数,它接受两个输入:一个对象和一个键,并返回对象中该键的相应值
- 你能用来自数组的属性名称生成一个对象吗
- 预期响应包含一个对象,但在angular js中得到一个数组错误
- Protractor:element.getText()返回一个对象,而不是String
- 如何使用jQuery添加另一个对象的高度作为边距
- 计算从一个对象到另一个对象的路径并沿其移动
- 如何将一个对象添加到每个对象数组中
- 为了避免创建全局变量,可以将所有变量分配给一个对象吗
- 将javascript对象(属性+值)合并到一个对象中
- 尝试简化检查对象键是否为true并将其推送到另一个对象
- 从 javascript 中的对象方法返回一个对象
- 响应应包含一个对象,但得到的却是GET操作的数组
- js:如何制作一个循环,将20个不同的东西添加到一个对象中
- 你能用javascript给一个对象一个键吗