当 eventListener 更改值时,文本插值不会在 angular 中更新

Text Interpolation is not updating in angular when an eventListener changes the value

我有两个 angular 应用程序,其中一个是带有加载子应用程序的 iframe 的父应用程序。 HTML 非常基础:

<div class="first">
    <label>{{postedMessage}}</label>
</div>
<div id="second">
    <iframe src="http://localhost:4200/" id="displayFrame" title="Compass" width="70%" 
    float="right" height="750px"></iframe>
</div>

父应用正在侦听来自子应用的 postMessage() 事件,在本例中为 localhost:4200。我知道 postMessage eventListener 正在工作,因为当父级执行 console.log(JSON.stringify(event)) 时,它会按预期进行记录。事件侦听器还同时更新 postedMessage 的值,但它不会在 UI 上更新。我不知道为什么。我尝试添加一个按钮,在调用 (click) 方法时以相同的方式更新值(除了它不是来自事件),并且完全按预期工作。

这是打字稿的样子:

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

@Component({
  selector: '',
  templateUrl: '',
  styleUrls: ['']
})
export class TestComponent {
  postedMessage: string = 'This is a test string';

    constructor() {
        window.addEventListener("message", this.handleEvent, false);
    }

  handleEvent(event: MessageEvent) {
    console.log(JSON.stringify(event));
    this.postedMessage = (JSON.stringify(event));
  }
}

如果有人知道为什么这不起作用,我们将不胜感激!谢谢

为了回答卡尔的回答,我无法提供实际的子应用程序代码。不过,在最基本的时尚中,它看起来像这样:

HTML:

<button (click)="postMessage()">Test</button>

打字稿:

postMessage() {
    // This is where I'd calculate the data being sent to the parent
    data: string; // Some JSON string
    window.parent.postMessage(data, this.parentOrigin);
{

这将是展示正在发生的事情的最简单方法,但如有必要,可以编写更深入的示例。

谢谢!

创建父子关系。如何?, 按照以下步骤操作。

1 - 导入输出 将下面的代码放入 child.ts 文件

import { Component Output, EventEmitter } from '@angular/core';

export class childTestComponent {

@Output() postMessage = new EventEmitter();

}

第 2 步 现在转到 child.html 文件并包含这行代码

<button type="button" (click)="postMessage.emit()">Post Message</button>

步骤 3 现在进入父级的 ts 文件并创建一个发射器,如下所示。发射器只是一个函数,但必须以“on”开头

onPostMessage() {
    *the rest of click event logic goes here*
     window.alert('button has been clicked');
   }

第 4 步 现在转到 parent.html 文件并将发射器绑定到包含子组件的行上的事件,例如

<childComponent (postMessage)="onPostMessage()"></childComponent>

如果有帮助请告诉我。

我想这是因为你需要让你的变量成为一个 Observable 流。这是我认为可以使您的代码工作的方法(注意:您需要安装 rxjs 才能使用 BehaviorSubject):

postedMessage: BehaviorSubject<string> = new BehaviorSubject<string>('This is a test string');

要确保在 handleEvent 中正确引用 class 组件的范围,请确保绑定 this:

constructor() {
    window.addEventListener("message", this.handleEvent.bind(this), false);
  }

然后在 handleEvent 函数中执行此操作:

handleEvent(event: MessageEvent) {
    this.postedMessage.next(JSON.stringify(event));
  }

也使用异步管道进行插值:

<label>{{ postedMessage | async }}</label>