站長資訊網
        最全最豐富的資訊網站

        Angular中為什么不要在模板中調用方法

        本篇文章給大家介紹一下Angular中不在模板(template)里面調用方法的原因,以及解決方法,希望對大家有所幫助!

        Angular中為什么不要在模板中調用方法

        在運行 ng generate component <component-name> 命令后創建angular組件的時候,默認情況下會生成四個文件:

        • 一個組件文件 <component-name>.component.ts
        • 一個模板文件 <component-name>.component.html
        • 一個 CSS 文件, <component-name>.component.css
        • 測試文件 <component-name>.component.spec.ts

        【相關教程推薦:《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!');   } }

        Angular中為什么不要在模板中調用方法

        我們在模板里面直接調用了getTranslatedName方法,很方便的顯示了該方法的返回值 hello world。 看起來沒什么問題,但如果我們去檢查console會發現這個方法不止調用了一次。

        Angular中為什么不要在模板中調用方法

        并且在我們點擊按鈕的時候,即便沒想更改originName,還會繼續調用這個方法。

        Angular中為什么不要在模板中調用方法

        原因與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,避免文章過長,就不詳述了。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲AV永久纯肉无码精品动漫| 精品亚洲成AV人在线观看| 一区二区国产精品| 久久久精品免费国产四虎| 亚洲码国产精品高潮在线| 国产精品99久久久久久猫咪| 国产精品涩涩涩视频网站 | 91嫩草亚洲精品| 欧美精品hdvideosex4k| 免费人成在线观看欧美精品| 51久久夜色精品国产| 51午夜精品免费视频| 亚洲综合无码精品一区二区三区| 国产日韩久久久精品影院首页| 欧美精品福利视频| 2021国产精品视频| 精品午夜福利在线观看| 亚洲精品白浆高清久久久久久| 婷婷国产成人精品一区二| 久久精品综合一区二区三区| 国产一区精品| 国产精品伦理久久久久久| 久久精品无码一区二区三区| 91精品欧美综合在线观看| 精品无码久久久久久尤物| 无码人妻精品中文字幕免费| 一本久久a久久精品亚洲| 亚洲精品国精品久久99热| 青草青草久热精品视频在线观看| 精品水蜜桃久久久久久久| 国产精品 羞羞答答在线| 91无码人妻精品一区二区三区L| 国产一区二区精品| 欧美精品亚洲精品日韩专区va| 精品一区二区久久| 思思99热在线观看精品| 99久久伊人精品综合观看| 国产成人精品一区二区三区| 国产成人无码精品久久久免费| 国产精品亚洲专区无码WEB| 久久99精品国产麻豆不卡|