无法读取未定义 Angular 6 的属性“nativeElement”

Posted

技术标签:

【中文标题】无法读取未定义 Angular 6 的属性“nativeElement”【英文标题】:Cannot read property 'nativeElement' of undefined Angular 6 【发布时间】:2019-03-17 14:13:44 【问题描述】:

我正在尝试为我的应用创建自定义 Spinner 组件,所以我已经创建了

spinner.component.ts

export class SpinnerComponent implements AfterViewInit 

    @ViewChild("spinner") spinner: ElementRef;

    constructor()  

    ngAfterViewInit(): void 
        this.spinner.nativeElement.style.display = "none";
    

    public show = (): void =>  this.spinner.nativeElement.style.display = "block"; ;

    public hide = (): void =>  this.spinner.nativeElement.style.display = "none"; ;


spinner.component.ts

<img #spinner src="assets/images/dotSpinner.gif" class="loading"/>

我正试图在我的其他组件中控制这个微调器,比如

sample.component.ts

import  SpinnerComponent  from "../spinner/spinner.component";

export class SimpleComponent 

    private spinner: SpinnerComponent = new SpinnerComponent();

    constructor() 

    actionHandler = (data: any): void => 
        this.spinner.show();
        this.clientActionService.subscribe(
            data => 
                this.spinner.hide();
                this.clientAction = data;
            ,
            err => 
                this.spinner.hide();
            
        );
    


但我遇到了错误 错误类型错误:无法读取未定义的属性“nativeElement” 在 SpinnerComponent.show

【问题讨论】:

您不应该手动创建组件实例。使用上面建议的查询(ViewChild,ContentChild)或DI机制。 我试过了,但我收到类似 ERROR 错误:StaticInjectorError(AppModule)[SimpleComponent -> SpinnerComponent]: StaticInjectorError(Platform: core)[SimpleComponent -> SpinnerComponent]: NullInjectorError: No provider对于 SpinnerComponent! 我确实在 app.module.ts 上注册过 【参考方案1】:

如果你想要解决方法,那么

<img
    [ngStyle]="'display': displayVal"
    src="assets/images/dotSpinner.gif"
    class="loading"/>

打字稿代码

display = "none";
public show = (): void =>  this.displayVal = "block"; ;
public hide = (): void =>  this.displayVal = "none"; ;

【讨论】:

方法正在调用但无法隐藏/显示微调器 Img【参考方案2】:

使用 forwardRef

forwardRef 用于当我们需要引用的令牌时 DI 的用途已声明,但尚未定义。它也用于 我们在创建查询时使用的令牌尚未定义。

   import  SpinnerComponent  from "../spinner/spinner.component";   
    export class SimpleComponent    
        constructor(constructor(@Inject(forwardRef(() => SpinnerComponent )) private ref:any)) 

        actionHandler = (data: any): void => 
            this.ref.show();
            this.clientActionService.subscribe(
                data => 
                    this.ref.hide();
                    this.clientAction = data;
                ,
                err => 
                    this.ref.hide();
                
            );
        

    

【讨论】:

Getting ERROR 错误:StaticInjectorError(AppModule)[SimpleComponent -> SpinnerComponent]: StaticInjectorError(Platform: core)[SimpleComponent -> SpinnerComponent]: NullInjectorError: No provider for SpinnerComponent! 将 SpinnerComponent 添加为 appModule 中的 entryComponent 你确实在 appModule 中将 SpinnerComponent 注册为 entryComponent 但仍然没有运气【参考方案3】:

spinner.component.ts // html 代码

 <img *ngIf="isShowSpinner" src="assets/images/dotSpinner.gif" class="loading"/>

 <button (click)="show()"> Show </button>
 <button (click)="hide()"> Hide </button>

spinner.component.ts //打字稿代码

public isShowSpinner: boolean = false;
constructor()  

public show()  this.isShowSpinner = true;     
public hide()  this.isShowSpinner = false; 

请试试这个。

【讨论】:

方法正在调用但无法隐藏/显示微调器 Img 你是哪个方法使用“显示”和“隐藏”函数调用的? (例如 onclick、click、change) 在示例组件上的 click() 上,我试图调用 Spinner 组件的 show() 感谢@Bhavin,但我们不能在微调器组件上设置按钮,我想处理来自其他组件的微调器,例如当 api 调用触发时,我们需要在 api 调用时显示微调器指示用户等待完成了我们可以隐藏它

以上是关于无法读取未定义 Angular 6 的属性“nativeElement”的主要内容,如果未能解决你的问题,请参考以下文章

Angular 6 TypeError:无法读取未定义的属性(读取“长度”)错误

错误类型错误:无法读取未定义 Angular 6 的属性“mData”

Angular 6 - 错误类型错误:无法读取未定义的属性“firstName”,同时显示输出

angular_1.default.module Uncaught TypeError:无法读取未定义的属性“模块”

Angular - 无法读取未定义的属性“..”

Angular2:无法读取未定义的属性“名称”