
1æãSkyengã§ã¯ãVimboxãã©ãããã©ãŒã ã®AngularJSããAngular 4ãžã®ç§»è¡ãå®äºããŸãããæºåãšç§»è¡äžã«ãèšç»ãåé¡è§£æ±ºãæ°ããäœæ¥èŠåã«é¢ããå€ãã®ã¡ã¢ãèç©ããHabréã«é¢ãã3ã€ã®èšäºã§å
±æããããšã«ããŸããã ç§ãã¡ã®ã¡ã¢ããåãå§ããã°ããã®Vimboxãããžã§ã¯ããšæ§é çã«é¡äŒŒããæçšãªãã®ã«ãªãããšãé¡ã£ãŠããŸãã
ãªããããå¿
èŠãªã®ã§ããïŒ
ãŸããAngularã¯ãã¹ãŠã«ãããŠãAngularJSãããåªããŠããŸããããéããç°¡åã§ã䟿å©ã§ããã°ãå°ãªãã§ãïŒããšãã°ããã³ãã¬ãŒããå
¥åãããšãããããšæŠãã®ã«åœ¹ç«ã¡ãŸãïŒã ããã«ã€ããŠå€ãã®ããšãè¿°ã¹ãããæžãããŠããŸãããç¹°ãè¿ãããšã«ã¯æå³ããããŸããã ããã¯Angular 2ã§ãç解ã§ããŸãããã1幎åã«ç§»è¡ãéå§ããã®ã¯æãã£ãã§ãïŒGoogleãåŸæ¹äºææ§ãªãã§æ¬¡ã®ããŒãžã§ã³ã§ãã¹ãŠãéããŸã«ããããšã決å®ãããã©ããªãã§ããããïŒ ç§ãã¡ã«ã¯å€§ããªãããžã§ã¯ãããããæ¬è³ªçã«æ°ãããã¬ãŒã ã¯ãŒã¯ãžã®ç§»è¡ã«ã¯æ·±å»ãªãªãœãŒã¹ãå¿
èŠã§ããã2幎ããšã«ãããããããããŸããã Angular 4ã§ã¯ããã以äžé©åœãèµ·ãããªãããšãæåŸ
ã§ããŸããã€ãŸãã移è¡ã®æãæ¥ããšããããšã§ãã
次ã«ããã©ãããã©ãŒã ã§äœ¿çšãããŠãããã¯ãããžãŒãæŽæ°ãããã£ãã ãäœããå£ããŠããªãå Žåã¯ä¿®åŸ©ããªãããšããååã«åŸã£ãŠãããè¡ãããªãå Žåãããæç¹ã§ããã©ãããã©ãŒã ããŒãããæžãçŽãããå Žåã«ã®ã¿ãã以äžã®é²æ©ãå¯èœãªå¢çãè¶ããŸãã é
ããæ©ããããããã«ãããAngularã«åãæ¿ããå¿
èŠããããŸããããããæ©ããã»ã©ã移è¡ã¯å®ããªããŸãïŒã³ãŒãã®éã¯åžžã«å¢å ããŠãããæ°ãããã¯ãããžã®å©ç¹ãããæ©ãåŸãããšãã§ããŸãïŒã
æåŸã«ã3çªç®ã®éèŠãªçç±ïŒéçºè
ã AngularJS-åæ Œããã¹ããŒãžãã¿ã¹ã¯ãå®è¡ããŸãããéçºã¯è¡ããããéçºããããŸããã ãã©ãããã©ãŒã ã¯åžžã«æé·ããŠããŸãã 匷åãªéçºè
ã§æ§æããã倧èŠæš¡ãªããŒã ã¯ååšããã匷åãªéçºè
ã¯åžžã«æ°ãããã¯ãããžãŒã«é¢å¿ããããåã«æ代é
ãã®ãã¬ãŒã ã¯ãŒã¯ã«å¯ŸåŠããããšã«èå³ã¯ãããŸããã Angularã«åãæ¿ãããšãåªç§ãªåè£è
ã«ãšã£ãŠæ¬ å¡ãããé¢çœããªããŸãã 次ã®2ã3幎ã§ããããã¯éåžžã«éèŠã«ãªããŸãã
ã©ã®ããã«é²ããŸããïŒ
移è¡ã¯ãã©ã¬ã«ã¢ãŒãã§å®è¡ã§ããŸãããã©ãããã©ãŒã ã¯AngularJSã§å®è¡ãããæåããèšè¿°ããŠæ°ããããŒãžã§ã³ããã¹ãããããæç¹ã§ãã°ã«ã¹ã€ãããåãæ¿ããã ãã§ãã 2çªç®ã®ãªãã·ã§ã³ã¯ãAngularJSãšAngularã®äž¡æ¹ãåæã«æ©èœãããããã¯ã·ã§ã³ã§çŽæ¥å€æŽãçºçããå Žåã®ãã€ããªããã¢ãŒãã§ãã 幞ããªããšã«ããã®ã¢ãŒãã¯ããèãããã ææžåãããŠããŸã ã
ãã€ããªãã移è¡ã¢ãŒããšãã©ã¬ã«ç§»è¡ã¢ãŒãã®éžæã¯ã補åã®éçºç¶æ³ã«ãã£ãŠç°ãªããŸãã ã¢ã¯ã·ã§ã³ãã©ã³ãæºåããŠããéçºè
ã¯ãå¥ã®äŒç€Ÿã§äžŠåã¢ãããŒãã®çµéšããããŸãããããã®å ŽåãäŸåé¢ä¿ã¯å°ãªãïŒã³ãŒãã¯ã»ãŒåãã§ãããïŒãæãéèŠãªããšã«ã1ãæéãã¹ãŠã®éçºãåæ¢ãã移è¡ã®ã¿ãåŠçããæ©äŒããããŸããã ã¢ãŒãã®éžæã¯ããã®ãããªèŽ
æ²¢ãè²·ãäœè£ããããã©ããã«äŸåããŸãã
ç§ãã¡ã«ãšã£ãŠã䞊è¡ç§»è¡ã«ã¯ãªã¹ã¯ããããŸããïŒæ°ããããŒãžã§ã³ã®æºåäžã«ããã¹ãŠã®éçºãåæ¢ãã移åã®æéãã©ãã ãããŸãèšç®ããŠããããã»ã¹ãåŒãããããå¯èœæ§ããããäœãã«ééãã次ã«äœããã¹ããç解ã§ããŸããã ãã€ããªããã¢ãŒãã§ã¯ããã®ç¶æ³ã§ã¯ãåæ¢ããŠãœãªã¥ãŒã·ã§ã³ãç©ããã«æ¢ãããšãã§ããŸããããã¯ãçŸåšã®å®çšŒåããŒãžã§ã³ããŸã 皌åããŠããããã§ãã å¹ççã«æ©èœãããå°ãé£ãããªããŸãããããã»ã¹ã¯åæ¢ããŸããã 䞊è¡ããŠã察å¿ããæ倱ã䌎ãããŒã«ããã¯ãçºçããŠããŸããã ç§ãã¡ã®ç§»è¡ããã»ã¹ãæ¬åœã«åŒãããããããšã«æ³šç®ãã䟡å€ããããŸã-412æéãèšç»ããŸããããå®éã«ã¯2åïŒ830ïŒã«ãªããŸããã ããããåæã«ãäœãæ¢ãŸãããæ°ããæ©èœã絶ããå±éããããã¹ãŠãæ£åžžã«æ©èœããŸããã
äžè¬çã«ããã€ããªããé·ç§»ã¯äžå¯æåã§ã¯ãªããAngularèªäœã®éçºè
ã«ãããšãå®å
šã«éåžžã®ããã©ã«ãã®æé ã§ãããšèãã䟡å€ããããŸãã 圌ãæããå¿
èŠã¯ãããŸããã
èšç»
ã¢ã¯ã·ã§ã³ã®ã·ãŒã±ã³ã¹ã¯æ¬¡ã®ããã«ãªããŸããã
- ãã€ããªããã¢ããªã±ãŒã·ã§ã³ã®åæåïŒè§åºŠãããŒãã¹ãã©ããããããŒãã¹ãã©ããè§åºŠã ãã¹ãŠããã®ãŸãŸæ®ããŸãããïŒãã€ããªããã¢ãŒããæ©èœããŠããéïŒé
ããªããé·ãéå§ããããã«ãªããŸãã ã³ã³ãããŒã©ãŒã
head
ã«æããæ©äŒã¯ãããããŸãããã¿ã€ãã«/ãã¡ãã³ã³/ã¡ã¿ã¿ã°ã®ãã¹ãŠã®äœæ¥ã¯ãé ã®å¿
èŠãªèŠçŽ ãšçŽæ¥ããåããããµãŒãã¹ã«éä¿¡ãããŸãã - ã¢ã³ã°ã«ãžã®ãµãŒãã¹ã®è»¢éïŒæãç°¡åã æžãæãããããµãŒãã¹ã¯ããŸã ã³ã³ããŒãã³ããå®è¡ããŠããAngularJSããããã«å©çšå¯èœã«ãªããŸãã äŸåé¢ä¿ã®ãªãæãåçŽãªãã®ããå§ãŸããããè€éãªãã®ãžã
- ãã¯ããŠã®æ®ãã®éšåãæç»ããŸãïŒåºæ¬ã³ã³ããŒãã³ãïŒGUIããã³ä»ã®ã³ã³ããŒãã³ã/ãã£ã¬ã¯ãã£ãã䜿çšããªãä»ã®ãã¹ãŠïŒã転éããŸãã å¯èœã§ããã°ããŠãããåäœã§ã³ã³ããŒãã³ããäžããäžã«ç§»åããŸãã
- 矜ããšããïŒããŒãžã®ã³ã³ããŒãã³ãã転éããAngularJSãåãåããŸãã
転éã«ãŒã«
ããŠãã€ãã«çŽæã®æè¡ç詳现ã«é²ã¿ãŸãããã ãããã®èšé²ãå°ãæé€ãããã©ãããã©ãŒã ã®ã¿ã«é¢ããäžå¿
èŠãªè©³çŽ°ãåé€ããŸããã ãããã¯æ®éçãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸãããã誰ããçºçããåé¡ã解決ããã®ã«åœ¹ç«ã€ãããããŸããã
ããã¹ãã®å£ãå¡ããªãããã«ããã¿ãã¬ã®äžã«ãã¹ãŠãé ããŸãã
åã
ã®ã¢ã€ãã ã転éããæ¹æ³
ã¢ãžã¥ãŒã«äœããã¢ããã°ã¬ãŒããå§ããŠããã¢ãžã¥ãŒã«ã«è§åºŠã¢ãžã¥ãŒã«ããªãå ŽåããããäœæããŠã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã¢ãžã¥ãŒã«ã«ããã¯ããŸãã
import {NgModule} from "@angular/core"; @NgModule({ // }); export class SmthModule {} @NgModule({ imports: [ ... SmthModule, ], }); export class AppModule {}
è§åºŠã¢ãžã¥ãŒã«ããŸã çããŠããå Žåãæ°ããã¢ãžã¥ãŒã«ã«ã¯.new
æ¥å°ŸèŸãä»ããããŸãã è§ã®å€ãã¢ãžã¥ãŒã«ãšäžç·ã«æ¥å°ŸèŸãåãåããŸãã
ãµãŒãã¹è¯ãã±ãŒã¹ã§ã¯ããã³ã¬ãŒã¿ãè¿œå ãããšã¯ã¹ããŒãããdefault
ãåé€ããã€ã³ããŒããç·šéãïŒããã©ã«ããåé€ããããïŒãã¢ãžã¥ãŒã«ã®è§åºŠã«ã€ã³ããŒãããã¢ãžã¥ãŒã«ã®è§åºŠã§ããŠã³ã°ã¬ãŒãããŸãïŒ
import {Injectable} from "@angular/core"; @Injectable() export class SmthService { ... } // angular module @NgModule({ providers: [ ... SmthService, ], }); // angularjs module import {downgradeInjectable} from "@angular/upgrade/static"; ... .factory("vim.smth", downgradeInjectable(SmthService))
ãµãŒãã¹ã¯ãAngurjarsã®å€ãååã§åŒãç¶ãå©çšã§ããè¿œå ã®æ§æã¯å¿
èŠãããŸããã
è¯ããªãã·ã§ã³ã¯ããã¹ãŠã®ã€ã³ãžã§ã¯ã·ã§ã³ãµãŒãã¹ãæ¢ã«Angularã«ç§»è¡ããŠããããã templateCache
ãcompiler
ç¹å®ã®ãã®ã¯äœ¿çšãããªãããšãæå³ããŸãã
æ®ãã®95ïŒ
ã®ã±ãŒã¹ã§ã¯ããŸã泚å
¥ããããã®ãã¢ããã°ã¬ãŒãããããããçš®é¡ã®å¥åŠãªãµãŒãã¹ãªã©ãåãé€ããŸãã
æåã¡ã¿ããŒã¿ã䜿çšããŠãã³ã¬ãŒã¿ãã³ã³ãããŒã©ã«èšŒæãããã³ã¬ãŒã¿ã®å
¥å/åºåãé
眮ããŠãã¯ã©ã¹ã®å
é ã«è»¢éããŸãã
import {Component, Input, Output, EventEmitter} from "@angular/core"; @Component({ // `-` , camelCase selector: "vim-smth", // require("./smth.html") templateUrl: "smth.html", }) export class SmthComponent { @Input() smth1: string; @Output() smthAction = new EventEmitter<void>(); ... } // angular module @NgModule({ declarations: [ ... SmthComponent, ], // , exports: [ ... SmthComponent, ], }); // angularjs module import {downgradeInjectable} from "@angular/upgrade/static"; ... .directive("vimSmth", downgradeComponent({ component: SmthComponent }) as ng.IDirectiveFactory)
泚å
¥ããããã¹ãŠã®ãµãŒãã¹ã¯ããã¹ãŠã³ã³ããŒãã³ãïŒããããããã¯ããæ¹æ³-Anythingã®äžïŒãå¿
èŠãšãããã³ãã¬ãŒãå
ã§äœ¿çšããããã¹ãŠã®ã³ã³ããŒãã³ã/ãã£ã¬ã¯ãã£ã/ãã£ã«ã¿ãŒã¯æ ŒçŽåº«ã«ããå¿
èŠããããŸãã
ãã³ãã¬ãŒãã§äœ¿çšããããã¹ãŠã®ã³ã³ããŒãã³ãå€æ°ã¯public
ãšããŠå®£èšããå¿
èŠããããŸããããã§ãªãå Žåã¯ãAoTã¢ã»ã³ããªã«åé¡ãããŸãã
ã³ã³ããŒãã³ããïŒå
¥åãä»ããŠïŒäžèšã®ã³ã³ããŒãã³ãããåºåçšã®ãã¹ãŠã®ããŒã¿ãåãåã£ãå Žåã changeDetection: ChangeDetectionStrategy.OnPush
ãã¡ã¿ããŒã¿ã«å€§èã«æžã蟌ã¿ãŸãã ããã¯ãã³ã³ããŒãã³ãã®å
¥åã®ãããããå€æŽãããå Žåã«ã®ã¿ãã³ãã¬ãŒããããŒã¿ãšåæããïŒãã®ã³ã³ããŒãã³ãã®å€æŽæ€åºãéå§ããïŒããšãè§åºŠã«äŒããŸãã çæ³çã«ã¯ãã»ãšãã©ã®ã³ã³ããŒãã³ãããã®ã¢ãŒãã«ãªã£ãŠããå¿
èŠããããŸãïŒãã ãããµãŒãã¹ãä»ããŠåºåçšã®ããŒã¿ãåãåãéåžžã«å€§ããªã³ã³ããŒãã³ãã®ãããã»ãšãã©ããã§ã¯ãããŸããïŒã
æ什ã³ã³ããŒãã³ããšåãã§ããããã³ãã¬ãŒããš@Directive
ãã³ã¬ãŒã¿ã¯ãããŸããã ããã«ããã¢ãžã¥ãŒã«ã«ã¹ããŒãããä»ã®ã¢ãžã¥ãŒã«ã®ã³ã³ããŒãã³ãã§äœ¿çšããããã«ãšã¯ã¹ããŒãããããã®ã¯åãã§ãªããã°ãªããŸããã
camelCaseã®ã»ã¬ã¯ã¿ãŒã¯ãã³ã³ããŒãã³ããã³ãã¬ãŒãã§ã䜿çšãããŸãã
ãã£ã«ã¿ãŒããã§@Pipe
ãªãã PipeTransform
ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããPipeTransform
ãŸãã ã³ã³ããŒãã³ã/ãã£ã¬ã¯ãã£ããããã¢ãžã¥ãŒã«ã«èªåèªèº«ãæã蟌ã¿ãä»ã®ã¢ãžã¥ãŒã«ã§äœ¿çšããå Žåã¯ãšã¯ã¹ããŒãããå¿
èŠããããŸãã
camelCaseã®ã»ã¬ã¯ã¿ãŒã¯ãã³ã³ããŒãã³ããã³ãã¬ãŒãã§ã䜿çšãããŸãã
è§åºŠã®ãã£ã¬ã¯ãã£ããšãã£ã«ã¿ãŒã¯ãè§åºŠã®ã³ã³ããŒãã³ããã³ãã¬ãŒãã§ã¯äœ¿çšã§ããŸãããéã®å Žåãåæ§ã§ãã ãã¬ãŒã ã¯ãŒã¯éã§ã¯ããµãŒãã¹ãšã³ã³ããŒãã³ãã®ã¿ãã¹ããŒãããŸãã
ãšã¯ã¹ããŒã/ã€ã³ããŒãããã³ã€ã³ã¿ãŒãã§ãŒã¹ãŸãããšã¯ã¹ããŒãã®ããã©ã«ããåãé€ããŸãããªããªãã AoTã³ã³ãã€ã©ãŒã¯ããã䜿çšã§ããŸããã
第äºã«ãã¢ãžã¥ãŒã«ã®çŸåšã®æ§é ïŒéåžžã«å€§ããïŒãšã€ã³ã¿ãŒãã§ãŒã¹ã®äœ¿çšïŒã¯ã©ã¹ãããåããã¡ã€ã«ã«ããŒãã眮ãïŒã®ããã«ããã®ãããªã€ã³ã¿ãŒãã§ãŒã¹ã®ã€ã³ããŒããšãã³ã¬ãŒã¿ãŒã§ã®äœ¿çšã§é¢çœããã°ããã£ããããŸããïŒã€ã³ã¿ãŒãã§ãŒã¹ããšã¯ã¹ããŒããå«ããã¡ã€ã«ããã€ã³ããŒããããå Žåã€ã³ã¿ãŒãã§ãŒã¹ã ãã§ãªããããšãã°ã¯ã©ã¹/å®æ°ã䜿çšãããŸãããã®ãããªã€ã³ã¿ãŒãã§ãŒã¹ã¯ããã³ã¬ãŒã¿ã®æšªã®å
¥åã«äœ¿çšããïŒ @Input() smth: ISmth
ïŒãã³ã³ãã€ã©ã¯ã€ã³ããŒããšã©ãŒexport 'ISmth' was not found
ã ããã¯ããã¹ãŠã®ã€ã³ã¿ãŒãã§ãŒã¹ãå¥ã®ãã¡ã€ã«ã«è»¢éããïŒã¢ãžã¥ãŒã«ã倧ããããã«ãã¡ã€ã«ã1ããŒã¹ã®ç»é¢ã«è¡šç€ºãããããã«æªãïŒããã€ã³ã¿ãŒãã§ãŒã¹ãã¯ã©ã¹ã«çœ®ãæããããšã§ä¿®æ£ã§ããŸãã ã¯ã©ã¹ã§çœ®ãæããããšã¯æ©èœããŸããã è€æ°ã®èŠªããç¶æ¿ããããšã¯ã§ããŸããã
éžæãããœãªã¥ãŒã·ã§ã³ïŒåã¢ãžã¥ãŒã«ã«interface
ãã£ã¬ã¯ããªãäœæãinterface
ãã£ã¬ã¯ããªã«ã¯ã察å¿ããã€ã³ã¿ãŒãã§ã€ã¹ïŒéšå±ãã¹ããããã³ã³ãã³ããã¯ãŒã¯ããã¯ã宿é¡ãªã©ïŒãå«ãæ¬è³ªçã«ååã®ä»ãããã¡ã€ã«ã眮ãããŸãã ãããã£ãŠãããŒã«ã«ã§ã¯ãªã䜿çšããããã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ãããã«çœ®ããããã®ãããªãã¡ã€ã«ãã£ã¬ã¯ããªããã€ã³ããŒããããŸãã
åé¡ã®ãã詳现ãªèª¬æïŒ
https://github.com/angular/angular-cli/issues/2034#issuecomment-302666897
https://github.com/webpack/webpack/issues/2977#issuecomment-245898520
æ©èœïŒtranskludããã©ã¡ãŒã¿ãŒã®åãæž¡ããsvgã®ã€ã³ããŒãïŒ
Transclubæ©èœã¢ããã°ã¬ãŒããããã³ã³ããŒãã³ããtransgludïŒ ng-content
ïŒã䜿çšããå Žåãè§åºŠãã³ãã¬ãŒãããã³ã³ããŒãã³ãã䜿çšãããšãïŒ
- ãã«ãã¹ãããã®ãã©ã³ã¹ã¯ãã¹ã¯æ©èœããã1ã€ã®
ng-content
ä»ããŠãã¹ãŠã1ã€ã®ããŒã¹ã«è»¢éããæ©èœã®ã¿ãæ©èœããŸãã - ãã®ãããªã³ã³ããŒãã³ãã®ç¿»èš³ã§ã¯ãUIãã¥ãŒãã¹ããŒã§ããŸããã åäœããŸããïŒãã¥ãŒããŒãã³ã³ããŒãã³ããã¢ããã°ã¬ãŒãããããšãããšäžæããŸããïŒã
- ã³ã³ããŒãã³ãããã®ããã«äœ¿çšãããå Žåããã®ã¢ããã°ã¬ãŒãã䜿çšãããŠãããã¹ãŠã®å Žæã®ã¢ããã°ã¬ãŒãã«å»¶æãããããã§ã«ã¢ããã°ã¬ãŒããããã³ã³ããŒãã³ãã®äžŠåæäœã®ããã«ãã®ã³ããŒãäœæããŸãã
ãã©ã¡ãŒã¿è»¢éã®æ©èœè§åºŠæåã§è§åºŠæåã䜿çšããå Žåãå
¥åã¯éåžžã®è§åºŠæåã®ããã«ïŒ []
ããã³()
ã䜿çšããŠïŒæžã蟌ãŸããŸããã kebab-case
<vim-angular-component [some-input]="" (some-output)=""> </vim-angular-component>
ãã®ãããªãã³ãã¬ãŒããã¢ã³ã°ã«ã§æžãæãããšãã¯ãcamelCaseã§ã±ããã±ãŒã¹ãç·šéããŸãã
åç/ svgãã³ãã¬ãŒããå¿
èŠä¹è»ã§ã¯ãªãã®ã§ã AoTã³ã³ãã€ã©ãŒã¯ãããèªããŸãã ãããã£ãŠãåããã¡ã€ã«ãtsãã¡ã€ã«ã«ã€ã³ããŒãããã³ã³ããŒãã³ãã®ã³ã³ããŒãã³ããä»ããŠè»¢éããŸãã
ã ã£ãïŒ
<span> ${require('!html-loader!image-webpack-loader?{}!./images/icon.svg')} </span>
ã«ãªããŸããïŒ
const imageIcon = require<string>("!html-loader!image-webpack-loader?{}!./images/icon.svg"); public imageIcon = imageIcon; <span [innerHTML]="imageIcon | vimBaseSafeHtml"> </span>
ãŸãã¯imgçµç±ã§äœ¿çšãããã
ã ã£ãïŒ
<img ng-src="${require('./images/icon.svg')}" />
ã«ãªããŸããïŒ
const imageIcon = require<string>("./images/icon.svg"); public imageIcon = imageIcon; <img [src]="imageIcon | vimBaseSafeUrl" />
åçãªã³ã³ããŒãã³ããšãã¿ãŒã³
$ã³ã³ãã€ã«ãªãã®ç掻æååããã®$compile
ããªãã®ã§ã $compile
ã¯ãããããŸããïŒå®éãå°ããªããã¯ããããŸãããããã§ã¯$compile
ãªãã§95ïŒ
ã®ã±ãŒã¹ã«å¯Ÿå¿ããæ¹æ³ã瀺ã$compile
ïŒã
åçã«æ¿å
¥ãããã³ã³ããŒãã³ãã¯ã次ã®ããã«ã¹ããŒãããŸãã
@Component({...}) class DynamicComponent {} @NgModule({ declarations: [ ... DynamicComponent, ], entryComponents: [ DynamicComponent, ], }) class SomeModule {}
æ¿å
¥ãããã³ã³ããŒãã³ãã®ã¯ã©ã¹ã¯ããµãŒãã¹ãå
¥åããŸãã¯ãã®ä»ã®æ¹æ³ã§ããŒã«ã§ããŸãã
vim-base-dynamic-component
ã¯ãå
¥å/åºåããµããŒãããä»ã®ã³ã³ããŒãã³ãã®åçæ¿å
¥çšã«æ¢ã«äœæãããvim-base-dynamic-component
ã§ãïŒå°æ¥ãå¿
èŠã«å¿ããŠïŒã
åçãªtemplateUrlã¯ãããŸããæ¡ä»¶ããšã«ç°ãªããã³ãã¬ãŒããåºåããå¿
èŠãããããã®ããã«åçãªtemplateUrl
ã䜿çšããå Žåããããæ§é ãã£ã¬ã¯ãã£ãã«çœ®ãæããŠãã³ã³ããŒãã³ãã3ã€ã«åå²ããŸãã ã¢ãã€ã«/éã¢ãã€ã«ã®åºåãåå²ããäŸïŒ
ãªã¯ãšã¹ã/ããŒã¿åŠç
ã¢ãã€ã«åãã®ãããã³ã°
ãã¹ã¯ãããçšãã£ã¹ãã¬ã€
æåã®ã³ã³ããŒãã³ãã«ã¯æå°éã®ãã³ãã¬ãŒãããããããŒã¿ã®æäœããŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãªã©ã®åŠçã«åãçµãã§ããŸãïŒãã³ãã¬ãŒãã¯ãç°¡æœãã®ãããã³ã³ããŒãã³ãã®ã³ã³ããŒãã³ããåå¥ã®htmlãã¡ã€ã«ãštemplateUrl
代ããã« ''ã«çœ®ãã®ãçã«ããªã£ãŠããŸãïŒã äŸïŒ
@Component({ selector: "...", template: ` <some-component-mobile *vimBaseIfMobile="true" [data]="data" (changeSmth)="onChangeSmth($event)"> </some-component-mobile> <some-component-desktop *vimBaseIfMobile="false" [data]="data" (changeSmth)="onChangeSmth($event)"> </some-component-desktop> `, })
vimBaseIfMobile
ã¯ãå
éšæ¡ä»¶ãšæž¡ããããã©ã¡ãŒã¿ãŒã«åŸã£ãŠå¯Ÿå¿ããã³ã³ããŒãã³ãã衚瀺ããæ§é ãã£ã¬ã¯ãã£ãïŒãã®å Žåã¯ngIf
çŽæ¥ã®é¡äŒŒç©ïŒã§ãã
æºåž¯é»è©±ãšãã¹ã¯ãããã®ã³ã³ããŒãã³ãã¯ãå
¥åãä»ããŠããŒã¿ãåä¿¡ããåºåãä»ããŠããã€ãã®ã€ãã³ããéä¿¡ããå¿
èŠãªãã®ã®åºåã®ã¿ãåŠçããŸãã ãã¹ãŠã®è€éãªããžãã¯ãåŠçãããŒã¿ã®å€æŽ-ãããã衚瀺ããã¡ã€ã³ã³ã³ããŒãã³ãã ãã®ãããªã³ã³ããŒãã³ãïŒdextop / mobileïŒã§ã¯ã changeDetection: ChangeDetectionStrategy.OnPush
å®å
šã«èšè¿°ã§ããŸãã
Angular Servicesã®äœ¿çš/ Angular Servicesã®ã³ã³ããŒãã³ã/ã³ã³ããŒãã³ã
ãµãŒãã¹/èŠå /ãããã€ããŒapp/entries/angularjs-services-upgrade.ts
ãéããæ¢åã®ã³ããŒãšè²Œãä»ãã®äŸã«åŸã£ãŠïŒãã®ãã¡ã€ã«å
ã®ãã¹ãŠïŒïŒ
// EXAMPLE: copy-paste, fix naming/params, add to module providers at the bottom, use // ----- import LoaderService from "../service/loader"; // NOTE: this function MUST be provided and exported for AoT compilation export function loaderServiceFactory(i: any) { return i.get(LoaderService.ID); } const loaderServiceProvider = { provide: LoaderService, useFactory: loaderServiceFactory, deps: [ "$injector" ] }; // ----- @NgModule({ providers: [ loaderServiceProvider, ] }) export class AngularJSServicesUpgrade {}
ããªãã¡ æ¢åã®ãããã¯ãã³ããŒããå¿
èŠãªãµãŒãã¹ãã€ã³ããŒããããã®ããã®å®æ°/é¢æ°ã®ååãç·šéãããã®äžã§äœ¿çšããããµãŒãã¹ãšãã®ååãç·šéããŸãïŒã»ãšãã©ã®å Žåã SmthService.ID
代ããã«ãæ ŒçŽåº«ã§ãµãŒãã¹ã«ã¢ã¯ã»ã¹ïŒ SmthService.ID
ããååãæ¿å
¥ããå¿
èŠããããŸãïŒãè¿œå æ°ããå®æ°smthServiceProvider
ããã¡ã€ã«ã®æåŸã«ãããããã€ããŒã®ãªã¹ãã«smthServiceProvider
ããŸãã
ãã®ãããªãµãŒãã¹ã¯ããã€ãã£ãã®AngularãšããŠäœ¿çšãããŸããã¯ã©ã¹ããšã«ã³ã³ã¹ãã©ã¯ã¿ã«åçŽã«æ³šå
¥ã§ããŸãã
æåå
ã®ã³ã³ããŒãã³ããå«ããã¡ã€ã«ã«ïŒæåã«ïŒæ¬¡ã®ã¹ã¿ããé
眮ããŸããããã«ãããã³ã³ããŒãã³ããè§åºŠç°å¢ã«ã¹ããŒã§ããŸãã
import {Directive, ElementRef, Injector, Input, Output, EventEmitter} from "@angular/core"; import {UpgradeComponent} from "@angular/upgrade/static"; @Directive({ selector: "vim-smth" }) export class SmthComponent extends UpgradeComponent { @Input() smth: boolean; @Output() someAction: EventEmitter<string>; constructor(elementRef: ElementRef, injector: Injector) { super("vimSmth", elementRef, injector); } } @NgModule({ declarations: [ ... SmthComponent, ] }) export class SmthModule {
ãã®å Žåã Component
代ããã«Directive
ãã³ã¬ãŒã¿ã䜿çšãããããšã«æ³šæããŠãã ãããããã¯ãAngularããããåŠçããæ¹æ³ã®æ©èœã§ãã
ãã¹ãŠã®å
¥å/åºåïŒå
ã®ã³ã³ããŒãã³ãããã®ãã€ã³ããŒïŒãç»é²ãdeclarations
察å¿ããã¢ãžã¥ãŒã«ã®declarations
ã³ã³ããŒãã³ããç»é²ããããšãå¿ããªãã§ãã ããã
å°æ¥ããã®ã³ã³ããŒãã³ããã¢ããã°ã¬ãŒããããšããã®ãããªã¹ã¿ãã¯è§åºŠã®å®éã®ã³ã³ããŒãã³ãã«ãªããŸãã
ã³ã³ããŒãã³ãïŒãŸãã¯å€ãã³ã³ããŒãã³ããã£ã¬ã¯ãã£ãïŒãã³ã³ãããŒã©ãŒ/ãªã³ã¯é¢æ°ã«$attrs
ã泚å
¥ããå Žåããã®ãããªã³ã³ããŒãã³ãã¯æ ŒçŽåº«ããæ ŒçŽåº«ã«ãã£ã¹ãã§ãããæ ŒçŽåº«ã®ã¢ããã°ã¬ãŒããããã³ããŒã®é£ã«ã¢ããã°ã¬ãŒããŸãã¯é
眮ããå¿
èŠããããŸãã
tslintãšã©ãŒãç¡å¹ã«ããã«ã¯ãã»ã¬ã¯ã¿ãŒã®ååãšãã£ã¬ã¯ãã£ãã®ãã³ã¬ãŒã¿ãŒã«å¯Ÿããã¯ã©ã¹ã®äžäžèŽãèªããªãããšãå¿
èŠã§ãã ãããã®è¡ïŒã³ã¡ã³ãïŒã¯ãã³ã³ããŒãã³ãã®ã¢ããã°ã¬ãŒãåŸã«åé€ããå¿
èŠããããŸãã
æ¯
æ¯$q
Promise
ãµãŒãã¹ã䜿çšãããšããã€ãã£ãPromise
眮ãæããããŸãã finally
ã¯ãããŸããããããã¯core.js/es7.promise.finally
ã«ãã£ãŠä¿®æ£ãããçŸåšã¯ä¿®æ£ãããŠããŸãã ãŸããé
延ã¯ãããŸãããts-deferredãè¿œå ãããæ¯åèªè»¢è»ãæžããªãããã«ããŸãã$timeout
ãš$interval
代ããã«ããã€ãã£ãwindow.setTimeout
ãšwindow.setInterval
$interval
䜿çšããŸããng-show="visible"
代ããã«ãå±æ§ng-show="visible"
ãã€ã³ã[hidden]="!visible"
;track by
åžžã«ã¡ãœããã§ããå¿
èŠããããŸãïŒã¡ãœããã®Track
åŸçœ®ãå¿ããªãã§ãã ããïŒïŒ
*ngFor="let item of items; trackBy: itemTrack" public itemTrack(_index: number, item: IItem): number { return item.id; }
- 99ïŒ
ã®å Žåã
$digest
ã $apply
ã $evalAsync
ãªã©ã¯ã眮æãªãã§åãåãããŸãã - ãµãŒãã¹ã€ã³ãžã§ã¯ã·ã§ã³ã®å Žåãã³ã³ã¹ãã©ã¯ã¿ã³ã³ã¹ãã©ã¯
constructor(private someService: SomeService)
ã«æžã蟌ãã ãã§ãè§åºŠèªäœãã©ãããååŸããããç解ããŸãã - ãã£ã¬ã¯ãã£ãå
ã§ãããããã³ã°ããèŠçŽ ã¯
constructor(private element: ElementRef)
AfterViewInit
ããã¢ã¯ã»ã¹å¯èœã§ã AfterViewInit
ããã¯ã§åæåãããŸãïŒ ElementRef
ã¯DOMãªããžã§ã¯ããã®ãã®ã§ã¯ãªãã this.element.nativeElement
ã«ãã£ãŠã¢ã¯ã»ã¹å¯èœthis.element.nativeElement
ïŒã ng-include
眮æãªãã§ng-include
ãªããã³ã³ããŒãã³ãã®åçäœæã䜿çšããŸããangular.extend
ã angular.merge
ã angular.forEach
ãªã©ãæ¬ èœããŠããããã€ãã£ãã®jsãšlodashã䜿çšããŠããŸããangular.element
ãšãã®ãã¹ãŠã®ã¡ãœãããæ¬ èœããŠããŸãã @ViewChild/@ContentChild
ã䜿çšãããã€ãã£ãjsãåŠçããŸããOnPush
ããŠã³ã³ããŒãã³ãã®æ€åºãã§ã³ãžã£ãŒããã«ããå¿
èŠãããå Žå- private changeDetectorRef: ChangeDetectorRef
æ¿å
¥ãprivate changeDetectorRef: ChangeDetectorRef
ããã³ãã«private changeDetectorRef: ChangeDetectorRef
this.changeDetectorRef.markForCheck()
;- ãã³ãã¬ãŒããã
$ctrl.
ãèŠã€ããŸãã$ctrl.
-ååã«ããsv-youããã³ã¡ãœãããžã®çŽæ¥ã¢ã¯ã»ã¹ã ng-bind-html="smth"
-> [innerHTML]="smth"
$sce
import {DomSanitizer} from "@angular/platform-browser";
> import {DomSanitizer} from "@angular/platform-browser";
ng-pural
> [ngPlural]
https://angular.io/api/common/NgPluralngClass
ã¯ãããã§ããŸãã
[ngClass]="{ [ styles.active ]: visible, [ styles.smth ]: smth }"
ãããã£ãŠãé
åã«çœ®ãæããŸã
[ngClass]="[ visible ? styles.active : '', smth ? styles.smth : '' ]"
ui-router
ãµãŒãã¹ã®ã¯ã©ã¹ã¯@uirouter/core
ããã€ã³ããŒããããå€ã$
ãã¬ãã£ãã¯ã¹ãªãã§æ¿å
¥ãããŸã
import {StateService, TransitionService} from "@uirouter/core"; constructor(stateService: StateService, transitionService: TransitionService) {
- ã³ã³ããŒãã³ãã®ããŒã¿å±æ§ã¯ã
attr.data-smth=""
ãŸãã¯[attr.data-smth]=""
ãšããŠç»é²ãããŸãã - ã³ã³ããŒãã³ãå
ã®
require
/ãã£ã¬ã¯ãã£ãã¯ãçŸåšã®ã³ã³ããŒãã³ãã³ã³ã¹ãã©ã¯ã¿ãŒcontructor(private parentComponent: ParentComponent)
ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«çŽæ¥ã³ã³ããŒãã³ãã¯ã©ã¹ãæ¿å
¥ããããšã§çœ®ãæããããŸãã Angularèªèº«ã¯ããããã³ã³ããŒãã³ãã§ããããšã確èªãããããããã¯ããŸãã 埮調æŽã®ããã«ã @Self
ïŒèŠªéã®æ€çŽ¢ïŒã @Self
ïŒã³ã³ããŒãã³ãäžã§çŽæ¥æ€çŽ¢ïŒã @Optional
ïŒååšããªãå Žåãšååšããªãå Žåããããå€æ°ã¯æªå®çŸ©ïŒã®@Optional
ããããŸãã è€æ°ã®@Host() @Optional() parentComponent: ParentComponent
ã¹ããŒã§ããŸãã ã³ã³ããŒãã³ã/ãã£ã¬ã¯ãã£ããã³ã³ããŒãã³ã/ãã£ã¬ã¯ãã£ãã«åå©çšã§ããŸãã - åæ¹åãã€ã³ãã£ã³ã°ã¯ããã®ã³ã³ããŒãã³ãã§ããæ瀺çã«ãªããåãååãšæ¥å°ŸèŸ
Change
Output
ãå¿
èŠãšãOutput
ã
export class SmthComponent { @Input() variable: string; @Output() variableChange = new EventEmitter<string>(); <vim-smth [(variable)]="localVar"></vim-smth>
- è§åºŠæåã®å¯èœãªåéæã®è§åºŠæåã ååä»ãã®translucããã§ãã¯ããå¿
èŠããããŸãïŒåäœãããã©ããïŒã»ã¬ã¯ã¿ãŒã§è¡ãããè§åºŠã§ïŒ
<ng-content></ng-content> <vim-angular-component> transcluded data </vim-angular-component>
次ã®ããŒãã§ã¯ããã€ããªããã¢ãŒãã§ã®äœæ¥ã®æ©èœ ãšãAngularã§æ
£ããªããã°ãªããªãæ°ããèŠåã«ã€ããŠèª¬æããŸã ã