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

        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號
        主站蜘蛛池模板: 91麻豆精品一二三区在线| 国产91精品在线观看| 无码人妻精品一区二区三区久久久| 国内精品免费视频精选在线观看| 最新在线精品国自av| 国产2021久久精品| 99精品国产丝袜在线拍国语| 亚洲成人国产精品| 精品国产人成亚洲区| 国产精品高清一区二区人妖| 伊在人亚洲香蕉精品区麻豆| 久久国产精品99久久久久久老狼| 亚洲国产精品成人精品无码区在线| 国产精品亚洲综合一区| 精品久久一区二区三区| 国产精品无码av在线播放| 亚洲精品成人无限看| 四虎永久在线精品免费一区二区| 国产啪亚洲国产精品无码| 亚洲国产综合91精品麻豆| 国产精品99久久精品| 精品午夜福利在线观看| 无码AV动漫精品一区二区免费| 精品福利一区二区三区| 国产99久久久国产精品~~牛| 热99re久久国超精品首页| 国产精品亚洲成在人线| 欧美亚洲色综久久精品国产| 中文字幕无码精品亚洲资源网久久| 四虎精品免费永久免费视频| 欧美日韩国产精品| 亚洲国产成人久久精品99| 在线观看91精品国产网站| 最新国产精品无码| 熟妇人妻VA精品中文字幕| 欧美精品hdvideosex4k| 国内精品久久久久影院一蜜桃| 国产精品无套内射迪丽热巴| WWW国产精品内射老师| 国产精品一级香蕉一区| 午夜精品视频在线|