Javascript AngularJS延迟错误:参数';fn';不是函数,获取对象

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

我正试图让我的应用程序在更改路线之前收集数据,正如约翰·林德奎斯特(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/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
}