在扩展控制器(ES6)中注入模块会导致未知提供程序错误

时间:2016-05-04 15:17:39

标签: javascript angularjs webpack ecmascript-6 babeljs

我有一个控制器类ModalCtrl,我想创建一个子类ModalCtrlChild extends ModalCtrl。问题是当我尝试这样做时,我在ModalCtrl中注入的任何模块中都会出现未知的提供程序错误。

我使用this生成器来构建项目,它在后台使用NgInject注入依赖项,我怀疑那里发生了一些有趣的事情。

ModalCtrl:

export default class ModalCtrl {
  static get UID(){
    return "ModalCtrl"
  }
  ... // all my ModalCtrl methods here

 /* @ngInject */
  constructor(ngDialog, PreoModalType, OutletService, $q, $timeout, VenueService) {
    "ngInject";
    ... // ModalCtrl constructor logic initing variables
  }
}

ModalCtrlChild:

import ModalCtrl from '../../preoModal.controller';

export default class ModalCtrlChild  extends ModalCtrl{
  static get UID(){
    return "modalCtrlChild"
  }

  /* @ngInject */
  constructor() {
    // "ngInject";
    console.log("in super constructor");
    super();
  }
}

错误:

Error: [$injector:modulerr] Failed to instantiate module function ModalCtrlChild() due to:
Error: [$injector:unpr] Unknown provider: ngDialog
http://errors.angularjs.org/1.5.3/$injector/unpr?p0=ngDialog

并且ngDialog 明确导入并正常工作。如果从ModalCtrlChild中删除extends ModalCtrl我没有收到任何错误,我的代码运行正常,但我无法获得所需的继承。任何想法都赞赏。

修改

在发布问题之前我曾尝试过eenagy的答案,但这也没有用,因为问题似乎是在子类注入中,而不是在父类的注入中。< / p>

sourdoughdetzel,尝试了你的建议:

  1. 从ModalCtrlChild中删除了注释和依赖项
  2. 从ModalCtrl中删除了注释和依赖项,但将它们保留在子项
  3. 得到完全相同的错误:

    Error: [$injector:modulerr] Failed to instantiate module function PreoModalController_Form() due to:
    Error: [$injector:unpr] Unknown provider: ngDialog
    

    我怀疑这与babel构建扩展类的方式有关,并且不允许ngInject做它的工作。我试图找到一种在这里进行手动注射的方法,这应该可以解决问题,并证明这是问题,因为我不太了解babel如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

我的猜测是,当你打电话给&#34; super()&#34;时,ngInject没有按照它应该在幕后做的那样做。来自一个子类&#39;构造函数。我在搜索时没有看到很多关于ngInject的信息,但由于手动调用正在发生的构造函数,它可能会被短路。

如果将依赖项放入ModalCtrlChild控制器并取消注释&#34; ngInject&#34; string,然后将它们传递给super()调用,它是否按预期工作?

答案 1 :(得分:1)

错误消息实际上告诉您缺少的内容。

Unknown provider: ngDialog

您还需要在子类中声明依赖项。

所以不是这个

import ModalCtrl from '../../preoModal.controller';

export default class ModalCtrlChild  extends ModalCtrl{
  static get UID(){
    return "modalCtrlChild"
  }

  /* @ngInject */
  constructor() {
    // "ngInject";
    console.log("in super constructor");
    super();
  }
}

您需要传递参数。

import ModalCtrl from '../../preoModal.controller';

export default class ModalCtrlChild  extends ModalCtrl{
  static get UID(){
    return "modalCtrlChild"
  }

  /* @ngInject */
  constructor(ngDialog, PreoModalType, OutletService, $q, $timeout, VenueService) {
    // "ngInject";
    console.log("in super constructor");
    super(ngDialog, PreoModalType, OutletService, $q, $timeout, VenueService);
  }
}

ngInject无法知道需要哪些依赖项。应该怎么知道?在现实世界中,可能有几十个ngDialog 的子类,它们与契约相匹配,并且可以作为参数传递。您需要指定需要哪个,以便将其传入。

举个例子,想象一下如果你有一个名为ngPopupDialog的ngDialog的子类。

你的示例子类。可以使用以下代替ngDialog,并匹配super。

import ModalCtrl from '../../preoModal.controller';

export default class ModalCtrlChild  extends ModalCtrl{
  static get UID(){
    return "modalCtrlChild"
  }

  /* @ngInject */
  constructor(ngPopupDialog, PreoModalType, OutletService, $q, $timeout, VenueService) {
    // "ngInject";
    console.log("in super constructor");
    super(ngPopupDialog, PreoModalType, OutletService, $q, $timeout, VenueService);
  }
}