为啥 Angular 2+ innerHTML 在单个语句中多次调用方法,如何解决这个问题

Posted

技术标签:

【中文标题】为啥 Angular 2+ innerHTML 在单个语句中多次调用方法,如何解决这个问题【英文标题】:Why Angular 2+ innerHTML is calling method multiple times in a single statement, How to solve this为什么 Angular 2+ innerHTML 在单个语句中多次调用方法,如何解决这个问题 【发布时间】:2019-08-05 07:26:41 【问题描述】:

我有这样的模板视图。

<p [innerhtml]="myfunction()"></p>

而且,ts 文件是这样的

import  Component  from '@angular/core';

@Component(
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
)
export class AppComponent  
  name = 'Angular';

  myfunction()
    alert(name);
    return '<div>abcd</div>';

  

这是一个从html调用通过innerhtml渲染html内容的简单方法,这里myfunction()多次调用,我收到多个警报,谁能帮我解决这个问题。

stackblitz 是 link

提前致谢

【问题讨论】:

这是正常行为:在显示周期中,Angular 将“重新检查”所有内容的状态,以防自上一步以来发生变化。最好不要调用函数,而是将值放在属性中。如果计算可能很复杂,请在ngOnInit 中调用它并将结果存储在一个属性中,并在模板中显示该属性。不将此作为答案发布,因为我不确定您是在问“为什么”会发生这种情况还是有解决方法。 它被多次调用,因为它在每个应用程序滴答声中调用,角度无法检测您的方法是否是幂等的。 我知道,angular会多次重新检查状态,在我的项目中,我通过innerHtml渲染输入元素,当我在输入框中输入内容时,它再次调用相同的方法,我需要获取输入元素中输入的值,这个 html 我是从服务器调用中获取的,所以我不能硬编码 【参考方案1】:

您可以使用纯管道仅在管道的输入发生更改时重新运行它:

@Pipe(name: 'functionCaller')
export class FunctionCallerPipe 
    transform(func: any, ...args: any[]): any 
        return func(...args);
    

然后像这样使用它:

<p [innerHTML]="myfunction| functionCaller : name"></p>
import  Component  from '@angular/core';

@Component(
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
)
export class AppComponent  
  name = 'Angular';

  myfunction(name: string)
    alert(name);
    return '<div>' + name + '</div>';
  

【讨论】:

好的,谢谢 pokrishka,我会检查这个并回来

以上是关于为啥 Angular 2+ innerHTML 在单个语句中多次调用方法,如何解决这个问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用innerHTML在angular 2中附加HTML内容

Angular 2 innerHTML 忽略表单标签

Angular 2 错误:无法绑定到“innerhtml”,因为它不是已知的本机属性

使用 Angular 2+ [innerHTML] 添加包含样式属性的 html

在innerHTML angular 2中注入<input>

我应该使用 [innerHTML] 还是通常的方式(Angular 2)