Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何使用参数实例化角度组件?_Angular_Typescript_Dependency Injection_Angular Components - Fatal编程技术网

Angular 如何使用参数实例化角度组件?

Angular 如何使用参数实例化角度组件?,angular,typescript,dependency-injection,angular-components,Angular,Typescript,Dependency Injection,Angular Components,我一直试图通过传递参数来实例化组件,比如nameFilter=newfiltercomponent(“Name”)但是我得到了这个错误: NullInjectorError:字符串没有提供程序 我相信依赖注入会导致这种情况,因为若我不向组件注入任何东西,我不会得到任何错误。那么,究竟是什么原因导致了这种情况,我该如何修复它呢 这是组件代码 import { Component, OnInit, Inject } from '@angular/core'; @Component({ s

我一直试图通过传递参数来实例化组件,比如
nameFilter=newfiltercomponent(“Name”)但是我得到了这个错误:

NullInjectorError:字符串没有提供程序

我相信依赖注入会导致这种情况,因为若我不向组件注入任何东西,我不会得到任何错误。那么,究竟是什么原因导致了这种情况,我该如何修复它呢

这是组件代码

import { Component, OnInit, Inject } from '@angular/core';

@Component({
     selector: 'app-filter',
     templateUrl: './filter.component.html',
     styleUrls: ['./filter.component.scss']
})
export class FilterComponent implements OnInit {
     title: String;

     constructor(title: String) {
          this.title = title;
     }

     ngOnInit() {
     }
}

错误很明显,您是对的,是依赖项注入机制造成的。传递到构造函数中的每个依赖项都必须在运行时注入,Angular需要知道传递什么

在您的情况下,Angular不知道作为字符串
title
注入什么

您可以显式地告诉Angular在字符串类型的模块提供程序数组中注入什么。但是,这意味着每次都将使用提供程序数组中提供的任何内容

@NgComponent({
    ...
    providers: [
    { provide: String, useValue: 'my title' }
  ],
})
查看代码后,可以使用
@Input
变量初始化组件-

导出类过滤器组件实现OnInit{
@输入()标题:字符串;
}

作为一种良好的设计实践,避免在组件构造函数中注入原始数据类型,如
string
number
date

但是如果你还需要注射的话。然后您应该让Angular知道标记和将要注入的值

为此,Angular提供了
InjectionToken
API

在组件中注入日期类型的示例:

export const DATE=new InjectionToken('DATE');
@NGO组分({
...
供应商:[
{provide:DATE,useValue:new DATE()}//也可以在模块中声明
],
})
导出类组件{
建造师(
@注入(日期)私有fromDate:DATE,
@注入(日期)私有toDate:日期
) {}
}

在构造函数参数中,您引用类型为
String
的标题,将其替换为
String
,在小写字母中,s不起作用。将其更改为
String
也不起作用,因为Angular将尝试为
String
这是一种基本类型的提供程序。作为一个好的设计,避免在构造函数中注入基元类型。我一直在尝试用不同的值创建一个组件类的多个实例,这就是为什么我这么做的原因。老实说,如果不注入原始值,我不知道该怎么做。你能解释一下怎么做吗?你正在寻找@Input,你将从调用组件的html中注入它。从html中注入值可能确实是更好的解决方案,但出于某种原因,我似乎无法让它工作。当我尝试您的第二个代码段时,标题值变得未定义。噢,一直以来都是“”。它应该是“”。
export class FilterComponent implements OnInit {
     @Input() title: string; 
}

<app-filter [title]="Title 1"></app-filter>