已解决 - 从指令中的组件获取属性 id

Posted

技术标签:

【中文标题】已解决 - 从指令中的组件获取属性 id【英文标题】:RESOLVED - Get attribute id from component in directive 【发布时间】:2021-03-06 13:16:57 【问题描述】:

我正在尝试在自定义指令中获取组件(标头)的属性 ID。同时我正在使用布局来显示标题。为此,我使用this.renderer.appendChild(this.elementRef.nativeElement, p);,但问题是我需要将此段落添加到特定的div(<div #identifier class="mid"></div>)中。这是我的代码:

HTML 布局

<div class="grid">
  <header mId id="navbar"></header>
</div>

标题组件

<div class="header-container">
  <h1 id="logo">...</h1>
  .
  .
  .
  <div #identifier class="mid"></div>
</div>

指令

import  ContentChild, Directive, ElementRef, Renderer2, ViewChild  from '@angular/core';
import  myService  from 'src/app/myService/service';

@Directive(
  selector: '[mId]'
)
export class IdDirective 
  @ViewChild('identifier') mId: ElementRef;

  constructor(private renderer: Renderer2, private myService: Service, private elementRef: ElementRef) 
    this.method();
  

  method() 
    this.service.getId().subscribe((response) => 
      const p = this.renderer.createElement('p');
      const text = this.renderer.createText('ID: ' + response.id);
      console.log(response.id);

      this.renderer.appendChild(p, text);
      this.renderer.appendChild(this.elementRef.nativeElement, p);
    );
  


结果是 id 号被放置在底部布局的 &lt;header&gt; 标记内,例如:

<header mId id="navbar">
      <h1 id="logo">...</h1>
      .
      .
      .
      <div #identifier class="mid"></div>
      .
      .
      .
      <p>ID: 1</p>
</header>

我需要最终的结果是:

<header mId id="navbar">
      <h1 id="logo">...</h1>
      .
      .
      .
      <div #identifier class="mid">
           <p>ID: 1</p>
      </div>
</header>

谁能知道我该怎么做或者我做错了什么?

【问题讨论】:

您能解释一下IdDirective的用途吗?为什么你把这段代码提取到这样的指令中?它会在其他地方重复使用吗? @VilmantasBaranauskas 是的,这段代码的目的是在未来的新组件中重用它 这是我的问题的解决方案。万岁!!! https://***.com/questions/42715318/can-i-access-child-elements-within-a-directive-in-angular2 这能回答你的问题吗? Can I access child elements within a directive in Angular2? 【参考方案1】:

要获取“标识符”,您应该使用 ContentChild,而不是 ViewChild,但您只能在 ViewInit 之后或在 setTimeout 中使用,以便让 Angular 有时间获取值

  @ContentChild('identifier') mId: ElementRef;

  constructor(private renderer: Renderer2, private elementRef: ElementRef) 
      setTimeout(()=>
        this.method();
      )
  

  method() 
    this.service.getId().subscribe((response) => 
      const response=id="currentID" 
      const p = this.renderer.createElement('p');
      const text = this.renderer.createText('ID: ' + response.id);

      this.renderer.appendChild(p, text);
      this.renderer.appendChild(this.mId.nativeElement, p);

      this.renderer.setAttribute(this.mId.nativeElement,"id",response.id)
    )
  

【讨论】:

以上是关于已解决 - 从指令中的组件获取属性 id的主要内容,如果未能解决你的问题,请参考以下文章

已发布的接口属性错误和解决方法

已解决:Spark 使非唯一字段按出现顺序具有 ID

无法在处理程序中获取数据何时(已解决:)

如何使用 Redux Promise 为我的组件获得已解决的承诺?

vue-resource获取数据绑定src属性报错【已解决】

解决了! Handlebars:访问已被拒绝解析属性“名称”,因为它不是其父级的“自己的属性”已修复