例外:没有数组的提供者!通过构造函数简写初始化变量时

Posted

技术标签:

【中文标题】例外:没有数组的提供者!通过构造函数简写初始化变量时【英文标题】:Exception: No provider for Array! When initializing variable through the constructor shorthand 【发布时间】:2017-02-08 19:34:33 【问题描述】:

我目前正在通过angular.io 网站了解 Angular2。跟随dashboard.component.ts的实现(见下图)。

(A1:我的实现)

import  Component, OnInit  from '@angular/core';
import  Hero      from './hero'
import  HeroService  from './hero.service';

@Component(
  moduleId: module.id,
  selector: 'my-dashboard',
  templateUrl: 'dashboard.component.html'
)
export class DashboardComponent implements OnInit 

    constructor(private heroes: Hero[], private heroService: HeroService)

    ngOnInit()
        this.heroService.getHeroes().then(heroList => this.heroes = heroList.slice(1,5))
    

    goToDetail(hero: Hero):void

    


我收到以下错误。

(A2:堆栈跟踪)

EXCEPTION: Uncaught (in promise): Error: Error in http://localhost:3000/app/dashboard.component.js class DashboardComponent_Host - inline template:0:0 caused by: No provider for Array!
ORIGINAL STACKTRACE:
Error: Uncaught (in promise): Error: Error in http://localhost:3000/app/dashboard.component.js class DashboardComponent_Host - inline template:0:0 caused by: No provider for Array!
    at resolvePromise (http://localhost:3000/node_modules/zone.js/dist/zone.js:429:31)
    at http://localhost:3000/node_modules/zone.js/dist/zone.js:406:13
    at ZoneDelegate.invoke (http://localhost:3000/node_modules/zone.js/dist/zone.js:203:28)
    at Object.onInvoke (http://localhost:3000/node_modules/@angular/core/bundles/core.umd.js:6242:41)
    at ZoneDelegate.invoke (http://localhost:3000/node_modules/zone.js/dist/zone.js:202:34)
    at Zone.run (http://localhost:3000/node_modules/zone.js/dist/zone.js:96:43)
    at http://localhost:3000/node_modules/zone.js/dist/zone.js:462:57
    at ZoneDelegate.invokeTask (http://localhost:3000/node_modules/zone.js/dist/zone.js:236:37)
    at Object.onInvokeTask (http://localhost:3000/node_modules/@angular/core/bundles/core.umd.js:6233:41)
    at ZoneDelegate.invokeTask (http://localhost:3000/node_modules/zone.js/dist/zone.js:235:42)
Unhandled Promise rejection: Error in http://localhost:3000/app/dashboard.component.js class DashboardComponent_Host - inline template:0:0 caused by: No provider for Array! ; Zone: angular ; Task: Promise.then ; Value: Error: Error in http://localhost:3000/app/dashboard.component.js class DashboardComponent_Host - inline template:0:0 caused by: No provider for Array! ... Error: No provider for Array!
    at NoProviderError.Error (native)
    at NoProviderError.BaseError [as constructor] (http://localhost:3000/node_modules/@angular/core/bundles/core.umd.js:1255:38)
    at NoProviderError.AbstractProviderError [as constructor] (http://localhost:3000/node_modules/@angular/core/bundles/core.umd.js:1739:20)
    at new NoProviderError (http://localhost:3000/node_modules/@angular/core/bundles/core.umd.js:1770:20)
    at ReflectiveInjector_._throwOrNull (http://localhost:3000/node_modules/@angular/core/bundles/core.umd.js:3366:23)
    at ReflectiveInjector_._getByKeyDefault (http://localhost:3000/node_modules/@angular/core/bundles/core.umd.js:3394:29)
    at ReflectiveInjector_._getByKey (http://localhost:3000/node_modules/@angular/core/bundles/core.umd.js:3357:29)
    at ReflectiveInjector_.get (http://localhost:3000/node_modules/@angular/core/bundles/core.umd.js:3166:25)
    at NgModuleInjector.get (http://localhost:3000/node_modules/@angular/core/bundles/core.umd.js:7222:56)
    at ElementInjector.get (http://localhost:3000/node_modules/@angular/core/bundles/core.umd.js:9303:52)
Error: Uncaught (in promise): Error: Error in http://localhost:3000/app/dashboard.component.js class DashboardComponent_Host - inline template:0:0 caused by: No provider for Array! ...

但是,当我以与网页上相同的方式编写时(查看下面的摘录),我不再收到错误 (A2)。为什么会这样?

(A3:教程提供的实现)

export class DashboardComponent implements OnInit 

  heroes: Hero[] = [];

  constructor(private heroService: HeroService)  

  ngOnInit(): void 
    this.heroService.getHeroes()
      .then(heroes => this.heroes = heroes.slice(1, 5));
  

  gotoDetail(hero: Hero): void  /* not implemented yet */

在教程中,按照我实现的方式 (A1) 定义构造函数应该与教程 (A3) 提供的代码在创建初始化英雄列表方面具有相同的结果。我错过了什么吗?

【问题讨论】:

【参考方案1】:

是的,你错过了这样一个事实,即第一种方式,你的构造函数有一个Hero[] 类型的附加参数,Angular 需要调用该构造函数,从而提供所需的参数,从而找到一个提供Hero[] 的实例传递给您的构造函数。

你不应该将英雄作为构造函数的一部分,因为 Angular 在构建组件时不能传递英雄。组件使用服务自行获取英雄。

【讨论】:

感谢您提供的信息,但我仍然无法理解您的答案,主要是因为我对角度概念还很陌生。您能否将我重定向到进一步讨论此案的消息来源?或者简单地进一步阐述你的观点:) 更新 我已经重读了 angular.io 依赖注入教程中关于“提供者”的部分。他们没有完全提到这是如何工作的。但是目前我假设通过将组件声明为@Injectable(),这将导致 Angular 尝试为构造函数中的每个参数查找提供程序,这是正确的吗? 组件始终是可注入的。因此,所有构造函数参数都是由 Angular 注入的服务。你的英雄数组不是一个可以注入的服务,它也不应该是一个参数,因为构造函数甚至不使用这个参数值。

以上是关于例外:没有数组的提供者!通过构造函数简写初始化变量时的主要内容,如果未能解决你的问题,请参考以下文章

程序没有按顺序通过构造函数,从而导致未初始化的变量

构造函数-用参数初始化表对成员变量初始化

构造函数-用参数初始化表对成员变量初始化

类和对象进阶

java类中成员变量初始化后存放在堆内存中还是栈内存中?

Widget的类变量和构造函数中初始化数组的区别?