AngularJS延迟错误:参数'fn'不是函数,得到对象
Posted
技术标签:
【中文标题】AngularJS延迟错误:参数\'fn\'不是函数,得到对象【英文标题】:AngularJS defer error: Argument 'fn' is not a function, got ObjectAngularJS延迟错误:参数'fn'不是函数,得到对象 【发布时间】:2013-04-15 19:43:40 【问题描述】:我正在尝试让我的应用在更改路线之前收集数据,正如 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
);
控制器 -
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;
它满足“寻找函数,得到对象”的错误。奇怪的是我将其更改为将其用作对象“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'
)
行不通。
【问题讨论】:
你试过使用 angular 1.0.5 试一试,同样的错误 我也坚持这个!我想在 $routeProvider.when() 的第二个参数的 route.resolve 属性中引用控制器方法。使用控制器定义的模块样式时我该怎么办? (也使用 yeoman)我被卡住了! 我在使用 CoffeeScriptmodule ($provide) -> $provide.provider 'XX', -> $get: -> "something"
时遇到了类似的错误,因为 CoffeeScript 返回最后一个值,该值被注入器误解了。我在要解决的语句后添加了null
。
由于控制器获取对象而不是函数而发生错误。我遇到了这个问题,因为 ES6 类已被声明为没有“导出默认值”。
【参考方案1】:
我有同样的问题。您可以通过执行以下操作来解决它..
从路由中删除控制器声明 .when() 方法。所以这...
.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>
【讨论】:
【参考方案2】:这将返回控制器对象:
var myCtrl = myApp.controller('whatever'...
但是路由想要实际的控制器功能。所以....假设这是您的控制器并解决:(注意我将控制器命名为“IndexCtrl”...我认为您的代码中没有这样做)
myApp = angular.module('myApp')
var IndexCtrl = myApp.controller('IndexCtrl', function($scope)
.. blah blah...
)
IndexCtrl.resolve =
loadData:function() ... blah blah...
您可以通过传入名称来从角度查找控制器。 (注意控制器引用是一个字符串)
.when('/',controller:'IndexCtrl', resolve:IndexCtrl.resolve)
【讨论】:
【参考方案3】:我多次遇到这个错误,终于找到了完美而简单的解决方案。只需将您的控制器名称放在“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
【讨论】:
【参考方案4】:如果您在工厂中链接时不小心包含了额外的括号,也会发生这种情况:
不好:
myModule.factory('monkey', ['$http', MonkeyFactory()]);
好:
myModule.factory('monkey', ['$http', MonkeyFactory]);
【讨论】:
这并不完全适合我 - 我完全忽略了MonkeyFactory
是出于疏忽,但这让我开始寻找正确的道路。【参考方案5】:
如果您使用 Coffescript + angularjs,也会发生这种情况。
由于 angularjs 支持 Coffescript 类。
class IndexCtrl
constructor: () ->
myApp.controller('IndexCtrl',IndexCtrl)
然后在 .when()
“控制器:IndexCtrl”看到的是对象,而不是函数。
【讨论】:
【参考方案6】:或者如果你错误地在工厂/控制器的名称之后进行了这样的注入(错误的方式);
angular.module('MyModule')
.factory('MyFactory', 'AnotherFactory', ['$http', function($http, AnotherFactory)
// CODE HERE
]);
正确的方法;
angular.module('MyModule')
.factory('MyFactory', ['$http', 'AnotherFactory', function($http, AnotherFactory)
// CODE HERE
]);
【讨论】:
【参考方案7】:我在 Coffeescript 中使用 Karma 进行模块模拟时遇到此错误。
解决方案是在 ($provide)-> 函数的末尾添加“return null”。没有它,coffeescript 将返回 $provide.value() 的结果,我猜它是一个对象,这会导致“'fn 不是函数”。
例子:
module 'myModule', ($provide)->
$provide.value 'myInjectable',
myFunction:-> return "dummy value"
return null # prevents "fn is not a function"
【讨论】:
【参考方案8】:我能够通过像这样添加 从另一个文件导入我的“函数”来解决这个“fn 不是函数,得到对象”:
import MenuCtrl from './controllers/MenuCtrl.js';
老办法:
import MenuCtrl from './controllers/MenuCtrl.js';
引用了这个问题:https://github.com/swimlane/angular-data-table/issues/189
【讨论】:
【参考方案9】:当我们在 html 中有一个未在控制器中定义的函数时,我们也会收到此错误。
【讨论】:
【参考方案10】:当我忘记导出我正在导入的类时出现此错误
import MyService from './services/MyService'
app.service('MyService', MyService);
MyService.js
class MyService()
// ... do stuff
需要
export default class MyService()
// ... do stuff
【讨论】:
以上是关于AngularJS延迟错误:参数'fn'不是函数,得到对象的主要内容,如果未能解决你的问题,请参考以下文章
Angularjs:错误:[ng:areq] 参数“HomeController”不是函数,未定义