为了清楚起见,我所知道的关于Angular 的所有内容都是组件和少量的指令.如果我的问题需要更高级的主题,比如服务或其他什么,那么就让我知道.

这是我的文件夹 struct

Folder Structure of my Project

这是我的应用程序组件HTML

 <app-game-control 
    [even] = "evenComponent"
    [odd] = "oddComponent">
</app-game-control>
<div class="outer"
    #outer>
      <div class="inner-even"
      #evenComponent>
        <app-even
          *ngFor="let value of even">
            {{value}} is Even
        </app-even>
      </div>

      <div class="inner-odd"
      #oddComponent>
        <app-odd
          *ngFor="let value of odd">
        {{value}} is Odd
        </app-odd>
      </div>
</div>

游戏控制TS文件

@Input() even?: HTMLDivElement
@Input() odd?: HTMLDivElement
@Input() outer?: HTMLDivElement

resetDisplay() {
    this.even?.remove()
    this.odd?.remove()
    // the next 2 lines are the problem
    this.outer?.appendChild(this.even) // it expects a Node, while I declared it as an HTMLDivElement
    this.outer?.appendChild(this.odd) // it expects a Node, while I declared it as an HTMLDivElement
    clearInterval(this.intervalFunction)
   }

现在,我知道ANGLE封装了DOM树.当我在游戏控制中访问outer并试图在App组件中操作DOM时,我想这不起作用.在本例中,我想在App组件的模板中添加偶数和奇数.我怎么能做到这一点?

推荐答案

由于HTMLDivElement是一个 node ,要修复您的错误,您可以将元素转换为:

this.outer?.appendChild(this.even as Node)
this.outer?.appendChild(this.odd as Node)

话虽如此,我认为这不是实现您想要的Angular 的最佳方法,不推荐从子组件操作父组件的DOM.

在这种情况下,更正确的方法是让您的游戏控制器通知父组件,您的游戏组件需要重置.

您可以对子组件使用@OUTPUT来完成此操作:

/*game-control.component.ts*/

@Output controlsNeedReset = new EventEmitter<void>();

resetDisplay() {
    this.controlsNeedReset.emit();
}

然后在您的父组件中拦截它:

<!--app.component.html-->

<app-game-control (controlsNeedReset)="reset()">
</app-game-control>
/*app.component.ts*/

reset() {
  // Here you can reset data for your game, so for example:
  this.even = [];
  this.odd = [];
}

你可以查Sharing data between child and parent directives and components个作为参考

Html相关问答推荐

我的表的第一列似乎是推其他2列到右边,我不能改变它

为所有必填字段添加所需的占位符文本(Angular Material)

正文不能填满浏览器100%的高度

如何防止可见的滑动抽屉,同时转移HTML方向?

使用HTML进行DAX测量

每个元素的CSS网格高度相等,以保持响应性

如何在VB.NET中用打印预览和直接打印的方式在Html中打印数据表的内容,包括页眉/设置纸张/方向/适合页面/总计

获取标准的Python脚本,以便使用FASK对网站进行Flask

如何使用*ngFor将模板从父级传递到子级

如何在ASP.NET Core中添加换行符

当多个a元素用作目标时的:target伪类

可以通过悬停时的自定义区域更改文本属性吗?

使用 Thymeleaf 将图像水平居中

您如何动态更改 Vue 中更高级别的标签的 CSS

用于表行组标题的正确 HTML 标记是什么?

如何并排放置
的定义列表,但如果
变长,
会向下移动?

如何让 backdrop-filter: blur() 效果在 iOS 上运行?

使用 bootstrap-icons 的未排序图标堆栈

如何在不删除

标记的情况下加入 HTML 中的段落

水平滚动框不显示所有元素