html - Angular 性能:DOM 事件导致不必要的函数调用
问题描述
我有一个带有 DOM 事件(输入)的输入元素的简单页面。HTML 页面还调用了一个函数,该函数仅通过 console.log 输出一些内容。现在当我打开页面时,它会显示日志,但是当我在输入字段中输入内容时,每次输入内容都会触发该功能..(实际上,当我输入字母时,它会 console.logs每次两次)
为什么会这样?如何预防?我读了一些关于 的东西changeDetection
,但是还有其他解决方案吗?
HTML:
{{test()}}
<input class="input-msg" [value]="textValue" (input)="textValue = $event.target.value;">
.ts:
export class TestComponent implements OnInit {
constructor() {
}
test() {
console.log('test message');
}
}
预期行为:
在{{test()}}
输入字段中输入内容时不应调用
解决方案
由于您在其中一种数据绑定语法中调用函数,因此每当 Angular 执行更改检测时,它都会调用此方法。
在函数之前,任何情况都是它返回的值。为了让 Angular 知道返回的值已经改变,Angular 必须运行它。
这与人们在这里提出的几个问题完全相同:
您可能想通读这些线程以了解此处发生的情况以及如何解决此问题。
解决方案是基本上以这样一种方式设计您的实现,即它永远不会以一种数据绑定语法调用方法,即
- 在字符串插值中 -
{{ methodCall() }}
- 在属性绑定中 -
[propertyName]="methodCall()"
- 在属性绑定中 -
[class.className]="methodCall()"
/[style.style-name]="methodCall()"
另一种解决方案是将此代码移动到子组件并将changeDetectionStrategy
该子组件上的配置为ChangeDetectionStrategy.OnPush
推荐阅读
- office365 - 有没有办法使用图形 API / sharepoint API 检测 office online 何时完成保存在 sharepoint 中?
- python - 使用 pandas 将连接的字符串拆分为单独的列
- javascript - 如何使用图像预览多次显示文件输入按钮?
- python - 基于共享节点在 Pandas 中查找邻居
- vue.js - 带有vue-routes的Vuejs无法读取未定义的属性“路径”
- python - 如何使用python从文本文件中获取特定值
- node.js - node.js(使用 ts-node)引用本地 TypeScript 模块导致构造函数的 TypeError
- javascript - 单击文本以检查输入
- ruby - 在哈希数组中查找和替换元素 - Ruby
- django - 如何在 Django+React+Webpack 应用中实现热重载