【问题标题】:angular.js:68 Uncaught Error: [ng:areq] Argument 'fn' is not a function, got Objectangular.js:68 未捕获的错误:[ng:areq] 参数“fn”不是函数,得到了对象
【发布时间】:2016-04-22 18:44:07
【问题描述】:

我正在将我们的 Angular 应用程序转换为使用 ES6 样式语法,并在更改所有文件后出现以下错误;

angular.js:68 Uncaught Error: [ng:areq] Argument 'fn' is not a function, got Object

当我尝试调试错误时,错误似乎在创建服务时出现。在角度代码中,这是发生错误的地方

return cache[serviceName] = factory(serviceName, caller);

我看到 serviceName 很好地通过了,但是调用者是未定义的,并且不确定为什么工厂无法返回服务实例。

谢谢

【问题讨论】:

  • caller 定义在哪里?
  • 那是 Angular 代码,不是我们的应用代码。
  • angular.js 第 4571 行方法名称 getService(serviceName,caller)) 我使用的角度版本是 1.5.3
  • 我的意思是你能告诉我们你转换成 es6 的代码吗?
  • 为什么不能发帖?我的意思不是复制和粘贴您的整个工作,只是说明您如何定义导致问题的工厂。

标签: angularjs ecmascript-6


【解决方案1】:

这是我的 github 帐户中的完整代码。 https://github.com/mars76/angular-es6

我的入口点是 app.js

import * as angular from 'angular';

import config from './app-config';

import run from './app-run-config';

import uiRouter from 'angular-ui-router';

import AppController from './app-controller';

import MyService from './my-service';

import * as serviceModule from './service';

import testDirective from './test-directive';

import muUtil from './util/util.js';
    export default angular.module("my-app", ['ui.router','my-service-module','myUtil'])

        .config(config)

        .run(run)

        .component('testDirective',testDirective())
        .controller('appController', AppController).name;

这依赖于模块“myUtil”

这是该模块的内容

./util/util.js

import * as utilRun from './util-run.js';
import * as MyService1 from './my-service1.js';
import * as MyService2 from './my-service2.js';

    export default angular.module('myUtil', [])

        .service('MyService1', MyService1)

        .service('MyService2', MyService2)

        .run(utilRun).name;

这是我的服务

服务 1:

export default class MyService1{
    constructor(){

    }

    init(){
        console.log('In MyService1()');
    }
}

服务 2:

    export default class MyService2{
    constructor(){

    }

    init(){
        console.log('In MyService2()');
    }
}

以及util模块的run函数

import MyService1 from './my-service1.js';
import MyService2 from './my-service2.js';

export default function utilRun(MyService1,MyService2){

    MyService1.init();
    MyService2.init();

}

utilRun.$inject =['MyService1','MyService2'];

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。就我而言,这只是导入的问题。

    这个文档帮助了我:import - JavaScript | MDN

    服务导出为default,并应通过以下方式导入您的./util/util.jsdefault

    import MyService1 from './my-service1.js';
    import MyService2 from './my-service2.js';
    

    我提示错误

    angular.js:68 Uncaught Error: [ng:areq] Argument 'fn' is not a function, got Object
    

    有原因,以这种方式导入时服务为undefined

    import * as MyService1 from './my-service1.js';
    import * as MyService2 from './my-service2.js';
    

    通配符导入不会导入默认值。这就是为什么在 ES6 语法中必须有一个特殊情况的原因:

    import defaultMember, * as name from "module-name";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 2014-06-29
      • 2016-08-08
      • 2018-07-01
      相关资源
      最近更新 更多