我正在尝试让我的应用在更改路线之前收集数据,如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 docs中指定of:
angular.module( 'saApp' )
.controller( 'DashboardCtrl', function ( $scope, dataset ) {});
路线:
.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
controller: 'DashboardCtrl'
} )
无效。
答案 0 :(得分:8)
我多次出现此错误,最终找到了完美而简单的解决方案。只需将控制器名称在'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
}
答案 1 :(得分:4)
返回控制器对象:
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})
答案 2 :(得分:4)
如果您在工厂中链接时意外包含额外的括号,也会发生这种情况:
BAD:
myModule.factory('monkey', ['$http', MonkeyFactory()]);
GOOD:
myModule.factory('monkey', ['$http', MonkeyFactory]);
答案 3 :(得分:2)
我有同样的问题。您可以通过执行以下操作来解决它..
从路由中删除控制器声明.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>
答案 4 :(得分:2)
或者,如果您错误地在工厂/控制器的名称之后进行了注射(错误方式);
angular.module('MyModule')
.factory('MyFactory', 'AnotherFactory', ['$http', function($http, AnotherFactory){
// CODE HERE
}]);
正确的方式;
angular.module('MyModule')
.factory('MyFactory', ['$http', 'AnotherFactory', function($http, AnotherFactory){
// CODE HERE
}]);
答案 5 :(得分:2)
我在使用Coffeescript中的Karma进行模块模拟时遇到了这个错误。
解决方案是添加&#34;返回null&#34;到($ offer)结束 - &gt;功能。如果没有这个,coffeescript将返回$ provide.value()的结果,我猜这是一个对象,它以某种方式导致&#34; fn不是函数&#34;。
示例:
module 'myModule', ($provide)->
$provide.value 'myInjectable',
myFunction:-> return "dummy value"
return null # prevents "fn is not a function"
答案 6 :(得分:2)
通过添加{},我可以通过从另一个文件导入我的'function'来解决这个“fn不是函数,得到对象”:
import {MenuCtrl} from './controllers/MenuCtrl.js';
老路:
import MenuCtrl from './controllers/MenuCtrl.js';
参考此问题:https://github.com/swimlane/angular-data-table/issues/189
答案 7 :(得分:1)
如果您正在使用Coffescript + angularjs,也会发生这种情况。
由于angularjs支持Coffescript类。
class IndexCtrl
constructor: () ->
myApp.controller('IndexCtrl',IndexCtrl)
然后在
。当()
&#39;控制器:IndexCtrl&#39;看到一个对象,而不是一个函数。
答案 8 :(得分:1)
当我忘记导出正在导入的类时出现此错误
import MyService from './services/MyService'
app.service('MyService', MyService);
MyService.js
class Myservice(){
// ... do stuff
}
必须
export default class Myservice(){
// ... do stuff
}
答案 9 :(得分:0)
当我们在html中有一个未在控制器中定义的函数时,也会收到此错误。