首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ElementRef未定义

ElementRef未定义
EN

Stack Overflow用户
提问于 2018-11-29 17:33:56
回答 1查看 11.7K关注 0票数 4

我在六角形应用程序中工作。我有一个文本区域,只要页面加载,我就想关注它。我不能这么做。

下面是页面的样子:

代码语言:javascript
复制
<div fxLayoutAlign="begin">
  <button mat-button color="primary" [routerLink]="['/Administration']">
    <i class="far fa-arrow-alt-circle-left"></i> Back to Administration
  </button>
</div>
    <div class="app-loading" *ngIf="_loading">
      <mat-spinner diameter=100></mat-spinner>
    </div>
    <div *ngIf="!_loading">

    <div class="knowledgeBody">

      <div *ngIf="_mode === 'view'">
        {{ _knowledgeText }}
        <div fxLayoutAlign="end">
          <button mat-button (click)="edit_clicked()" disabled="{{ _knowledgeText.trim().length === 0 }}">
            <i class="fas fa-edit"></i> Edit
          </button>
        </div>
      </div>

      <div *ngIf="_mode !== 'view'">
        <textarea matInput [(ngModel)]="_knowledgeText" cdkTextareaAutosize #knowledgeTextarea>
          {{ _knowledgeText }}
        </textarea>

        <div fxLayoutAlign="end">
          <button mat-button (click)="save_clicked()" disabled="{{ _knowledgeText.trim().length === 0 }}">
            <i class="fas fa-save"></i> Save
          </button>
        </div>
      </div>

  </div>

</div>

感兴趣的文本区域是#knowledgeTextarea。

下面是页面的组件:

代码语言:javascript
复制
@Component({
  selector: 'app-knowledge',
  templateUrl: './knowledge.component.html',
  styleUrls: ['./knowledge.component.scss']
})
export class KnowledgeComponent implements OnInit {

  private _mode : string;
  private _loading : boolean;
  private _knowledgeId : string;
  private _knowledgeText : string;
  private _description : string;
  private _groupPK : string;

  @ViewChild('knowledgeTextarea') knowledgeTextarea : ElementRef;

  constructor(private _activatedRoute : ActivatedRoute,
    private _watermelonService : WatermelonService,
    private _logService : LoggingService,
    private _dialog: MatDialog) {
      this._loading = true;
    }

  ngOnInit() {
…
    this.knowledgeTextarea.nativeElement.focus();
…
  }
…
}

当我运行这个程序时,我会得到以下错误:

代码语言:javascript
复制
Cannot read property ‘nativeElement’ of undefined.

我已经读过,当您使用*ngIf块中的#标识符(#knowledgeTextarea)引用页面上的元素时,可能会发生这种情况。所以这个…

代码语言:javascript
复制
  <div *ngIf="_mode !== 'view'">
    <textarea matInput [(ngModel)]="_knowledgeText" cdkTextareaAutosize #knowledgeTextarea>
      {{ _knowledgeText }}
    </textarea>
</div>

…都不管用。

但还有什么可供选择的呢?

我试过这个…

代码语言:javascript
复制
  <div *ngIf="_mode !== 'view'">
    <textarea matInput [(ngModel)]="_knowledgeText" cdkTextareaAutosize #knowledgeTextarea>
      {{ _knowledgeText }}
    </textarea>
    {{ knowledgeTextarea.focus() }}
</div>

…这起作用了,但后来我得到了一个ExpressionChangedAfterItHasBeenCheckedError,JB告诉我不要这样做:Getting ExpressionChangedAfterItHasBeenCheckedError error

如果有别的办法,请告诉我。我想要的是能够在页面加载时给予文本区域焦点。任何实现这一目标的方法都将受到极大的感谢。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-29 20:07:03

问题是在呈现元素之前访问它。必须确保在使用内容之前呈现内容。因此,与其在ngOnInit中访问它,不如在ngAfterViewInit中进行访问。

代码语言:javascript
复制
 @ViewChild('knowledgeTextarea') knowledgeTextarea: ElementRef;

  ngAfterViewInit() {
    this.knowledgeTextarea.nativeElement.focus();
  }

工作样本在这里- https://stackblitz.com/edit/angular-jjyfwf

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53544625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档