Javascript AngularJS延迟错误:参数';fn';不是函数,获取对象
我正试图让我的应用程序在更改路线之前收集数据,正如约翰·林德奎斯特(John Lindquist)的许多视频所示: 我已将其全部连接,但当延迟对象需要解决时,我得到了错误:Javascript AngularJS延迟错误:参数';fn';不是函数,获取对象,javascript,angularjs,runtime-error,promise,deferred,Javascript,Angularjs,Runtime Error,Promise,Deferred,我正试图让我的应用程序在更改路线之前收集数据,正如约翰·林德奎斯特(John Lindquist)的许多视频所示: 我已将其全部连接,但当延迟对象需要解决时,我得到了错误: 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
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
控制器-
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'
} )
不起作用 我也有同样的问题。您可以通过执行以下操作来解决此问题 从路由中删除控制器声明。当() 方法。所以这个
.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>
{{一些花哨的仪表板材料}
这将返回控制器对象:
var myCtrl = myApp.controller('whatever'...
但路由需要实际的控制器功能。所以假设这是您的控制器并解决:(注意,我将控制器命名为'IndexCtrl'…我认为您在代码中没有这样做)
您可以通过传入名称来查找控制器。(请注意,控制器引用是一个字符串)
我多次出现这个错误,最终找到了完美而简单的解决方案。只需将控制器名称在“when”结构中用引号括起来,如下所示:
.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
controller: 'Dashboard',
resolve: Dashboard.resolve
}
import {MenuCtrl} from './controllers/MenuCtrl.js';
而不是
.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
controller: Dashboard,
resolve: Dashboard.resolve
}
如果在工厂中链接时意外包含额外的括号,也会发生以下情况: 坏的: 好:
如果使用Coffescript+angularjs,也会发生这种情况 因为angularjs支持Coffescript类
class IndexCtrl
constructor: () ->
myApp.controller('IndexCtrl',IndexCtrl)
然后在
.when()
“controller:IndexCtrl”看到的是一个对象,而不是一个函数。或者如果您错误地在工厂/控制器的名称后面进行了注入,就像这样(错误的方式) 正确的道路
angular.module('MyModule')
.factory('MyFactory', ['$http', 'AnotherFactory', function($http, AnotherFactory){
// CODE HERE
}]);
我在Coffeescript中使用Karma进行模块模拟时出错 解决方案是在($provide)->函数的末尾添加“returnnull”。否则,coffeescript将返回$provide.value()的结果,我猜这是一个对象,不知何故导致“'fn不是函数” 例如:
module 'myModule', ($provide)->
$provide.value 'myInjectable',
myFunction:-> return "dummy value"
return null # prevents "fn is not a function"
我可以通过从另一个文件导入我的“函数”来解决“fn不是函数,get对象”,方法是添加{},如下所示:
.when( '/dashboard', {
templateUrl: 'views/dashboard/dashboard.html',
controller: 'Dashboard',
resolve: Dashboard.resolve
}
import {MenuCtrl} from './controllers/MenuCtrl.js';
老办法:
import MenuCtrl from './controllers/MenuCtrl.js';
引用此问题:当我们在html中有一个未在控制器中定义的函数时,也会出现此错误。当我忘记导出我正在导入的类时,会出现此错误
import MyService from './services/MyService'
app.service('MyService', MyService);
MyService.js
class Myservice(){
// ... do stuff
}
需要
export default class Myservice(){
// ... do stuff
}
你试过使用angular 1.0.5吗?试过了,同样的错误我也被卡住了!我想在$routeProvider.when()的第二个参数中引用route.resolve属性中的控制器方法。当使用控制器定义的模块样式时,我该怎么做?(也使用yeoman)我卡住了!当使用CoffeeScript
模块($provide)->$provider.provider'XX',->$get:->“something”
时,我遇到了类似的错误,因为CoffeeScript返回的最后一个值被注入器误解了。我在要解析的语句后添加了一个null
。由于控制器获取的是对象而不是函数,因此会发生错误。我遇到这个问题是因为ES6类被声明没有“导出默认值”。这对我来说并不完全是-我完全忽略了MonkeyFactory
,但这让我开始寻找正确的路径。
import MenuCtrl from './controllers/MenuCtrl.js';
import MyService from './services/MyService'
app.service('MyService', MyService);
class Myservice(){
// ... do stuff
}
export default class Myservice(){
// ... do stuff
}