Cet article vous présentera les raisons pour lesquelles les méthodes ne sont pas appelées dans les modèles dans Angular, ainsi que les solutions. J'espère qu'il sera utile à tout le monde !
Lorsque vous créez un composant angulaire après avoir exécuté la commande ng generate composant <component-name></component-name>
, quatre fichiers seront générés par défaut : ng generate component <component-name></component-name>
命令后创建angular组件的时候,默认情况下会生成四个文件:
<component-name>.component.ts</component-name>
<component-name>.component.html</component-name>
<component-name>.component.css</component-name>
<component-name>.component.spec.ts</component-name>
【相关教程推荐:《angular教程》】
模板,就是你的HTML代码,需要避免在里面调用非事件类的方法。举个例子
<!--html 模板--> <p> translate Name: {{ originName }} </p> <p> translate Name: {{ getTranslatedName('你好') }} </p> <button (click)="onClick()">Click Me!</button>
// 组件文件 import { Component } from '@angular/core'; @Component({ selector: 'my-app', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], }) export class AppComponent { originName = '你好'; getTranslatedName(name: string): string { console.log('getTranslatedName called for', name); return 'hello world!'; } onClick() { console.log('Button clicked!'); } }
我们在模板里面直接调用了getTranslatedName
方法,很方便的显示了该方法的返回值 hello world。
看起来没什么问题,但如果我们去检查console会发现这个方法不止调用了一次。
并且在我们点击按钮的时候,即便没想更改originName
,还会继续调用这个方法。
原因与angular的变化检测机制有关。正常来说我们希望,当一个值发生改变的时候才去重新渲染对应的模块,但angular并没有办法去检测一个函数的返回值是否发生变化,所以只能在每一次检测变化的时候去执行一次这个函数,这也是为什么点击按钮时,即便没有对originName
进行更改却还是执行了getTranslatedName
当我们绑定的不是点击事件,而是其他更容易触发的事件,例如 mouseenter, mouseleave, mousemove
等该函数可能会被无意义的调用成百上千次,这可能会带来不小的资源浪费而导致性能问题。
一个小Demo:
https://stackblitz.com/edit/angular-ivy-4bahvo?file=src/app/app.component.html
大多数情况下,我们总能找到替代方案,例如在onInit
赋值
import { Component, OnInit } from '@angular/core'; @Component({ selector: 'my-app', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], }) export class AppComponent implements OnInit { originName = '你好'; TranslatedName: string; ngOnInit(): void { this.TranslatedName = this.getTranslatedName(this.originName) } getTranslatedName(name: string): string { console.count('getTranslatedName'); return 'hello world!'; } onClick() { console.log('Button clicked!'); } }
或者使用pipe
<component-name>.component.ts</component-name>
<component-name>.component.html</component-name>
<component-name>.component.css</component-name>
<component-name>.component.spec.ts</component-name>
tutoriel angulaire"]
Le modèle est votre code HTML et vous devez éviter d'y appeler des méthodes non événementielles. Par exemple🎜rrreeerrreee🎜getTranslatedName
dans le modèle, qui affiche commodément la valeur de retour de la méthode hello world.
Il ne semble y avoir aucun problème, mais si nous vérifions la console, nous constaterons que cette méthode est appelée plus d'une fois. 🎜🎜originName
. 🎜🎜getTranslatedName
est toujours exécuté même si le originName
n'est pas modifié 🎜🎜Lorsque nous lions non pas l'événement de clic, mais d'autres événements de modification qui sont facilement déclenchés. , tels que mouseenter, mouseleave, mousemove
, etc., peuvent être appelés des centaines ou des milliers de fois sans signification, ce qui peut entraîner un gaspillage considérable de ressources et entraîner des problèmes de performances. 🎜🎜Une petite démo : 🎜🎜https://stackblitz.com/edit/angular-ivy-4bahvo?file=src/app/app.component.html🎜🎜Dans la plupart des cas, nous y Il y a toujours des alternatives, comme attribuer des valeurs 🎜rrreee🎜 dans
onInit
ou utiliser pipe
pour éviter de rendre l'article trop long, donc je n'entrerai pas dans les détails. 🎜🎜Pour plus de connaissances sur la programmation, veuillez visiter : 🎜Vidéos de programmation🎜 ! ! 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!