ã¢ã³ã®ã¥ã©ãŒã®2çªç®ã®ããŒãžã§ã³ã¯ãªãªãŒã¹ã«è¿ã¥ãããŸããŸãå€ãã®äººã
ãããã«èå³ãæã¡å§ããŠããŸãã ãããŸã§ã®ãšãããç¹ã«ãã·ã¢èªã§ã¯ãã¬ãŒã ã¯ãŒã¯ã«é¢ããæ
å ±ãããŸããªããäžéšã®ãããã¯ã§ãŸããŸãå€ãã®çåãçããŠããŸãã
å€ãã®è³ªåãæèµ·ãã1ã€ã®ãããã¯ã¯ãäŸåæ§æ³šå
¥ã§ãã äžéšã®äººã
ã¯åæ§ã®æè¡ã«åºããããŠããŸããã ä»ã®äººã¯ãä»ã®ãã¬ãŒã ã¯ãŒã¯ã«ååšããä»ã®å®è£
ã«äœ¿çšããããããAngular 2ã®ãã¬ãŒã ã¯ãŒã¯å
ã§ã©ã®ããã«æ©èœããããå®å
šã«çè§£ããŠããŸããã
ãããŠãææããã¯ã2çªç®ã®è§åºŠã®DIãä»ã®ãã®ãšã¯å®éã«ã¯å€å°ç°ãªããšããäºå®ã«ãããŸããããã¯äž»ã«ã2çªç®ã®ããŒãžã§ã³ã®äžè¬çãªã¢ãããŒããšå²åŠã«ãããã®ã§ãã ããã¯ãã¢ããªã±ãŒã·ã§ã³å
šäœãæ§ç¯ããããšã³ãã£ãã£ãã³ã³ããŒãã³ãã§ãããšããäºå®ã«åºã¥ããŠããŸã ã ãµãŒãã¹å±€ãã«ãŒã¿ãŒãäŸåæ§æ³šå
¥ã·ã¹ãã ã¯äºæ¬¡çã§ãããã³ã³ããŒãã³ãå
ã§ã®ã¿æå³ããããŸãã ããã¯ãæ°ãããã¬ãŒã ã¯ãŒã¯ã®ã¢ãŒããã¯ãã£ã®çè§£ã®æ ¹åºã«ããéåžžã«éèŠãªãã€ã³ãã§ãã
ã¯ããã«
ããã¯ããã2ããŒãžã®æ¹å®ã§ãã Angular 2ã§ã®äŸåæ§æ³šå
¥ã«é¢ããããã¥ã¡ã³ãïŒ thisããã³this ã
ãªãTypescriptãèšäºã§ã¯ãTypescriptã䜿çšããŸãã ãªãã§ïŒ
ãã¬ãŒã ã¯ãŒã¯èªäœã¯Typescriptã§èšè¿°ãããŠãããAngular2 + Typescriptãã³ãã«ã«é¢ããæ
å ±ãæãå€ããªã£ãŠããŸãã
æ§æã®èгç¹ããèŠãTypescriptã³ãŒãã¯ãESæšæºã®æ°ããå®è£
ã远å ã®åä»ããããã³ããã€ãã®ãã«ããŒããªãã¯ã§ãã ãã ããã¢ããªã±ãŒã·ã§ã³ã¯JavascriptãšDartã®äž¡æ¹ã§äœæã§ããŸãã JSããŒãžã§ã³ã§ã¯ãES6 +æ§æã䜿çšã§ããŸããããã³ãŒãã®ç°¡æœããšæçãã倱ãããŸãã ãŸããæ°ããæ©èœããµããŒãããããã«Babelãæ§æããå Žåãæ§æçã«ã¯ãã¯ã©ã¹ã泚é/ãã³ã¬ãŒã¿ãŒãªã©ããã¹ãŠãTSã³ãŒãã«éåžžã«äŒŒãŠããŸãã ãŸããåãªãã§ã®ã¿ãªã®ã§ãäŸåæ§æ³šå
¥ã¯å°ãéã£ãŠèŠããŸãã
äŸåé¢ä¿ã®åé¡
æœè±¡ã¢ããªã±ãŒã·ã§ã³ãäœæããã³ãŒããå°ããªè«ççãªéšåã«åå²ããŠããããšãæ³åããŠãã ããïŒãããã£ãŠãè§åºŠã®çšèªãšæ··åããªãããã«ããã³ã³ããŒãã³ãããšåŒã³ãŸãã ãããžãã¹ããžãã¯ãå«ãåãªããµãŒãã¹ã¯ã©ã¹ã«ããŸãããïŒã
export class Engine { public cylinders = 4; // default } export class Tires { public make = 'Flintstone'; public model = 'Square'; } export class Car { public engine: Engine; public tires: Tires; constructor() { this.engine = new Engine(); this.tires = new Tires(); } drive() {} }
ãã¡ãããããã«ã¯ãŸã£ããããžãã¯ã¯ãããŸãããã説æã«éåžžã«é©ããŠããŸãã
ããã§åé¡ã¯äœã§ããïŒ çŸæç¹ã§ã¯ã Car
ãã³ã³ã¹ãã©ã¯ã¿ãŒã§æåã§äœæããã2ã€ã®ãµãŒãã¹ã«å€§ããäŸåããŠããŸãã Car
ãµãŒãã¹ã®æ¶è²»è
ã®èгç¹ããèŠããšãããã¯è¯ãããšã§ãããªããªãã Car
ã¢ãã£ã¯ã·ã§ã³ã¯ãã®ã¢ãã£ã¯ã·ã§ã³èªäœãäžè©±ããããã§ãã ãã ããããšãã°ãå¿
èŠãªãã©ã¡ãŒã¿ãŒãEngineã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããããã«ããå Žåã¯ã Car
èªäœã®ã³ãŒãã倿Žããå¿
èŠããããŸãã
export class Engine2 { constructor(public cylinders: number) { } } export class Car { public engine: Engine; public tires: Tires; constructor() { this.engine = new Engine2(8); this.tires = new Tires(); } }
TSã®ã³ã³ã¹ãã©ã¯ã¿ãŒ // , // : export class Engine2 { public cylinders constructor(cylinders: number) { this.cylinders = cylinders } }
ãããã£ãŠãã³ã³ã·ã¥ãŒããŒã§äŸåé¢ä¿ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããšã¯ããŸããããããŸããã
Car
äŸåé¢ä¿ã€ã³ã¹ã¿ã³ã¹ãå€éšããæž¡ãããããã«ã³ãŒããæžãçŽããŸãã
export class Car { constructor(public engine: Engine, public tires: Tires) { } }
ãã§ã«è¯ãã ãµãŒãã¹èªäœã®ã³ãŒããåæžããããµãŒãã¹èªäœãããæè»ã«ãªããŸããã ãã¹ããšæ§æãç°¡åã§ãïŒ
class MockEngine extends Engine { cylinders = 8; } class MockTires extends Tires { make = "YokoGoodStone"; } let car = new Car(new Engine(), new Tires()); let supercar = new Car(new Engine2(12), new Tires()); var mockCar = new Car(new MockEngine(), new MockTires());
ãã ããåé¡ã¯Car
ãµãŒãã¹ã®ã³ã³ã·ã¥ãŒããŒããå§ãŸããŸãããµãŒãã¹èªäœã ãã§ãªãããã¹ãŠã®äŸåé¢ä¿ãäœæããŠãããäœæãããµãŒãã¹äŸåé¢ä¿ã®ã€ã³ã¹ã¿ã³ã¹ãCar
ã³ã³ã¹ãã©ã¯ã¿ãŒã«è»¢éããå¿
èŠããããŸãã
ãããŠãããããã®æ°ããã³ã³ããŒãã³ããšããããã®æ°ããäŸåé¢ä¿ã«ããããµãŒãã¹ã€ã³ã¹ã¿ã³ã¹ãäœæããããšããŸããŸãå°é£ã«ãªã£ãŠããŸãã ãã¡ããã Car
ãµãŒãã¹ãäœæããããã®ãã¹ãŠã®ããžãã¯ãåãåºããã¡ã¯ããªãŒãäœæã§ããŸãã
export class CarFactory { createCar() { let car = new Car(this.createEngine(), this.createTires()); car.description = 'Factory'; return car; } createEngine() { return new Engine(); } createTires() { return new Tires(); } }
ããããåé¡ã¯ç¹ã«å°ãªããªãããšã¯ãããŸããCar
äŸåé¢ä¿ã倿Žãããšãã¯ãå·¥å Žãæåã§ææ°ã«ä¿ã€å¿
èŠããããŸãã
å®è£
ãžã®é
ã©ãããã°ã³ãŒããæ¹åã§ããŸããïŒ ãã¹ãŠã®æ¶è²»è
ã¯ãå¿
èŠãªäŸåé¢ä¿ãµãŒãã¹ãç¥ã£ãŠããŸãã ããããã·ã¹ãã ã®æ¥ç¶æ§ãæžããããã«ãæ¶è²»è
ã¯ããããèªåã§äœæããã¹ãã§ã¯ãããŸããã ãã¹ãŠã®ãµãŒãã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããã³ä¿åãããã·ã³ã°ã«ãã³ã¯ã©ã¹ãäœæã§ããŸãã ãã®ã¯ã©ã¹ã§ã¯ãå¿
èŠãªãµãŒãã¹ãäœæããæ¹æ³ã決å®ããããšãã°ç¹å®ã®ããŒã§ããããååŸã§ããŸãã æ¬¡ã«ããµãŒãã¹ã§ã¯ãäœããã®æ¹æ³ã§ãã®ãããªã·ã³ã°ã«ãã³ã®ã€ã³ã¹ã¿ã³ã¹ãååŸããã ãã§ååã§ããããã§ã«ããããäŸåé¢ä¿ã®æ¢è£œã®ã€ã³ã¹ã¿ã³ã¹ãååŸããŸãã ãã®ãã¿ãŒã³ã¯ãServiceLocatorãšåŒã°ããŸãã ããã¯ãå¶åŸ¡ã®å転ã®äžçš®ã§ãã æ¬¡ã«ãã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
import {ServiceLocator} from 'service-locator.ts'; // ... let computer = ServiceLocator.instance.getService(Car) //
äžæ¹ã§ã¯ãæ¶è²»è
ã®ç·å¯ãªæ¥ç¶ãšãã®äŸåé¢ä¿ãåãé€ããŸããããã¹ãŠã®ãµãŒãã¹ã¯æ¶è²»è
ã®å€éšã§äœæãããŸãã ãããã仿¹ã§ã¯ãæ¶è²»è
ã¯ãµãŒãã¹ãã±ãŒã¿ãŒãšå¯æ¥ã«æ¥ç¶ãããŠããŸããåæ¶è²»è
ã¯ããµãŒãã¹ãã±ãŒã¿ãŒã€ã³ã¹ã¿ã³ã¹ãã©ãã«ããããç¥ãå¿
èŠããããŸãã ããŠããµãŒãã¹ã®äœæã¯ãŸã æåã§ãã
äœããã®æ¹æ³ã§ããã®äŸåé¢ä¿ãšäŸåé¢ä¿ã€ã³ã¹ã¿ã³ã¹ãé
眮ããã倿°ãã³ã³ã·ã¥ãŒããŒã§åçŽã«ç€ºãããµãŒãã¹èªäœã®äœæãšå®è£
ãèªååã§ããããã«ããããšèããŠããŸãã
ããã¯ãDIãã¬ãŒã ã¯ãŒã¯ãè¡ãããšã§ãã æ¿å
¥ãããäŸåé¢ä¿ã®ã©ã€ããµã€ã¯ã«ã管çãããããã®äŸåé¢ä¿ãå¿
èŠãªå Žæã远跡ããŠå®è£
ããŸãã ã³ã³ã·ã¥ãŒããŒãèŠæ±ããäŸåé¢ä¿ã®äœæãããã€ã³ã¹ã¿ã³ã¹ãã³ã³ã·ã¥ãŒããŒã«è»¢éããŸãã ãµãŒãã¹ãã±ãŒã¿ãŒãžã®åŒ·ãäŸåã¯æ¶è²»è
ããæ¶ããŸããDIãã¬ãŒã ã¯ãŒã¯ã¯ãã±ãŒã¿ãŒãšé£æºããããã«ãªããŸããã
äœåã®æ¬è³ªã¯æ¬¡ã®ãšããã§ãã
- ãŸããäœããã®æ¹æ³ã§ãã€ã³ãžã§ã¯ã¿ãŒãã«æ³šå
¥ããããã¹ãŠã®äŸåé¢ä¿ãç»é²ããå¿
èŠããããŸããåãµãŒãã¹ã«ã€ããŠããããäœæããæ¹æ³ãšãåŸã§ãµãŒãã¹ãã±ãŒã¿ãŒã§èŠã€ããæ¹æ³ã説æããå¿
èŠããããŸãã
- ã³ã³ã·ã¥ãŒããŒã¯ãå¿
èŠãªäŸåé¢ä¿ã瀺ããŸãã
- DIã³ã³ãããŒã¯ãå®è£
ãã€ã³ãã®ååšã«ã€ããŠããã°ã©ã ãã¹ãã£ã³ããŸãã
- 誰ããäŸåé¢ä¿ãå¿
èŠãšãããšããã³ã³ããã¯ãã®ãµãŒãã¹ãã±ãŒã¿ã§ãµãŒãã¹ã®é©åãªã€ã³ã¹ã¿ã³ã¹ãèŠã€ããå¿
èŠã«å¿ããŠãã®ã€ã³ã¹ã¿ã³ã¹ã泚å
¥ããŸãã
ãŸããDIãã¬ãŒã ã¯ãŒã¯ã«å¿ããŠããããã®é
ç®ã¯ã³ãŒãå
ã§ç°ãªã£ãŠèŠããŸãã
è§åºŠ1
ãã®ãã¬ãŒã ã¯ãŒã¯ã®2çªç®ã®ããŒãžã§ã³ã®ããã€ã¹ãç¹ã«DIãããããçè§£ããããã«ãæåã®éšåã®é
çœ®æ¹æ³ã«ã€ããŠå°ã説æããããšæããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ã©ã€ããµã€ã¯ã«ã¯ãããã€ãã®æ®µéã§æ§æãããŠããŸãã 2ã€ã®æ®µéã匷調ããããšæããŸãã
- æ§æ ãã®æ®µéã§ãã¢ããªã±ãŒã·ã§ã³ã«å«ãŸããã¢ãžã¥ãŒã«ãæ§æãããŸãã éãããäŸåæ§æ³šå
¥ã®ã¿ãå©çšå¯èœã§ãã éåžžãã¢ãžã¥ãŒã«ã®èšå®ã«ã¯ãå°æ¥äœ¿çšããããµãŒãã¹ã®èšå®ãå«ãŸããŸãã ãµãŒãã¹ã¯ã ãããã€ããŒãä»ããŠæ§æã§ããŸãããã®æ®µéã§å®è£
ã§ããæ§ææžã¿ã®ãµãŒãã¹ã€ã³ã¹ã¿ã³ã¹ãåŸã§è¿ãç¹å¥ãªãªããžã§ã¯ãã§ãã
- èµ°ã ããã§ãæ§æãããã¢ããªã±ãŒã·ã§ã³ã皌åããŠããŸãã ãã¹ãŠã®äŸåé¢ä¿ãå©çšå¯èœã§ããããµãŒãã¹ã¯æ¢ã«äœæãããŠããïŒå®éãé
å»¶åæåããããŸããããã€ã³ãã¯ãããŸããïŒãæ§æãããŠããŸãã
æäžäœã«ã¯ã¢ãžã¥ãŒã«ããããŸãã ã¢ãžã¥ãŒã«ã¯ãå®éã«ã¯ãã¢ããªã±ãŒã·ã§ã³ããµãŒãã¹ãã³ã³ãããŒã©ãŒããã£ã¬ã¯ãã£ãããã£ã«ã¿ãŒãªã©ã®ããŸããŸãªéšåãç»é²ããã³ä¿åã§ããåãªããªããžã§ã¯ãã§ãã ãŸããã¢ãžã¥ãŒã«ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®å¯Ÿå¿ããæ®µéã§èµ·åãããèšå®åŒã³åºããšå®è¡åŒã³åºããå«ããããšãã§ããŸãã
ãã®ãããæåã®ããŒãžã§ã³ã§ã¯äŸåæ§æ³šå
¥ã¯æ¬¡ã®ããã«ãªããŸãã
ã³ãŒã // - function factory() { var privateField = 2; return { publicField: 'public', publicMethod: function (arg) { return arg * privateField; } }; } var module = angular.module('foo', []); // // 'MyService' // , , - (2- ) module.factory('MyService', factory); // 'MyController' // module.controller('MyController', function (MyService) { console.log(MyService.publicMethod(21)); // })
ã¯ããããããã®ãã¥ã¢ã³ã¹ããããŸãã ããšãã°ãæåã®æ ŒçŽåº«ã«ã¯ãã§ã«5çš®é¡ã®ãµãŒãã¹ããããŸã ããã®ãããããŸããŸãªæ¹æ³ã§ãµãŒãã¹ãç»é²ã§ããŸãã ãããŠãã³ãŒããçž®å°ãããšãã颿°ã®åŒæ°ã¯å€æŽãããå¯èœæ§ããããããäŸåé¢ä¿ã宣èšããããã«å¥ã®æ§æã䜿çšããããšããå§ãããŸã...
ããããç§ã¯æåã®è§åºŠã®ãžã£ã³ã°ã«ãæãäžããããªãã®ã§ãäž»ãªãã€ã³ãã®ã¿ãæžããŸãã
- ãã¹ãŠã®ãµãŒãã¹ã¯ã·ã³ã°ã«ãã³ã§ãã
- äœãïŒãµãŒãã¹ãcottollersãªã©ïŒã®ç»é²ã¯ã察å¿ãã颿°ãã€ãŸã ã¢ãžã¥ãŒã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªéšåã®äžçš®ã®ãªããžããªã§ãã
- äŸåæ§æ³šå
¥ã¯è¡ã§çºçããŸãã ãµãŒãã¹ãã±ãŒã¿ãŒã¯ãªããžã§ã¯ãå
ã®ãã¹ãŠãä¿åããã³æ€çŽ¢ããŸããããŒã¯ãããã€ããããµãŒãã¹ã®ååã§ãå€ã¯ã€ã³ã¹ã¿ã³ã¹ã§ãã å®éãã³ã³ãããŒã©ãŒããŸã å®è£
ã§ããŸãã ãããã®ã€ã³ã¹ã¿ã³ã¹ã¯ä¿åãããŸããããã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ãä¿åãããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãç¹å¥ãªãµãŒãã¹$ã€ã³ãžã§ã¯ã¿ãŒããããŸãã ããã¯ãäŸåé¢ä¿ãæåã§ååŸã§ãããµãŒãã¹ãã±ãŒã¿ãŒã§ãã éåžžã圌ã¯ã¢ããªã±ãŒã·ã§ã³å
šäœã«å¯ŸããŠ1人ã§ãã
- äŸåé¢ä¿ã¯ãã¡ã€ã³ã¢ãžã¥ãŒã«ã«ç»é²ãããŠããäŸåé¢ä¿ããæ€çŽ¢ãããŸãã ã¡ã€ã³ã¢ãžã¥ãŒã«ã¯ãHTMLããŒãžãçŽæ¥ããŒãããã¢ãžã¥ãŒã«ã§ãã
- ã¢ãžã¥ãŒã«ã®äœææã«äŸåé¢ä¿ãæå®ãããšã$ã€ã³ãžã§ã¯ã¿ãŒã¯çŸåšã®ã¢ãžã¥ãŒã«ã ãã§ãªããäŸåããã¢ãžã¥ãŒã«ã§ãäŸåé¢ä¿ãæ¢ããŸãã
Angular 2ïŒæ°ããæ¹æ³
è§åºŠã®2çªç®ã®ããŒãžã§ã³ã¯ãæåããèšè¿°ãããæ°ãããã¬ãŒã ã¯ãŒã¯ãšããŠçºè¡šãããæåã®éšåã®ãã¹ãŠã®ãšã©ãŒãèæ
®ããŸããã ããŒãžã§ã³2ã䜿çšããã®ã§ããŸãã«ãã®å°è±¡ããããŸããã äžèŠãªãšã³ãã£ãã£ãšæŠå¿µã¯ãªããªããŸããã æ®ããããã®ã¯ããè¯ãããã䟿å©ã«ãªã£ãã ãã§ã驿°ã¯ããŸãé©åããè«ççã«èŠããŸãã
å®éãæåã®è§åºŠã¯ãDIã䜿çšããŠæ¥çãããæçšãªããªãã¯ããã¯ããã¯ãããã³ãã¿ãŒã³ã®ã»ããã§ããã ãããããã®äžéšã®äžéšã¯ããèªäœã§äœããã®åœ¢ã§ããããããã«ã°ãã°ãã§ããã åäžã®ã³ã³ã»ããã¯ãããŸããã§ããã
- ã³ã³ãããŒã©ãŒã¯ãããŸããŸãªæ¹æ³ã§DOMã«æ¿å
¥ã§ããŸãã屿§ãã«ãŒã¿ãŒïŒæ¢ã«3ã€ã®ããŒãžã§ã³ããããŸãïŒã·ã³ãã«ãªãªãªãžãã«ãæŽç·ŽããããµãŒãããŒãã£ãããã³2çªç®ã®éšåããã®ããã¯ããŒãïŒããã£ã¬ã¯ãã£ããä»ããŠã
- DOMããªãŒãšäžŠè¡ããŠãã¹ã³ãŒãã®éå±€ãæã€ããªãŒãããããã®ããªãŒå
ã§ã¯ã³ã³ãããŒã©ãŒãä»ããŠããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŸããã ã¹ã³ãŒãèªäœã¯ãã»ãšãã©ãããã¿ã€ãã®ããã«ç¶æ¿ã§ããŸãããåé¢ã§ããŸãã ãã©ã³ã¹ã¯ã«ãŒãã¹ã³ãŒãã®çè§£ã¯éåžžã«å°é£ã§ããã
- ã¹ã³ãŒãã®éå±€ã«é¢é£ä»ããããç¬èªã®ã€ãã³ãã·ã¹ãã ããããããŸããŸãªæ¹åã«ããŒã¿ã転éããããšãã§ããŸããã
ãã®çµæãã¢ããªã±ãŒã·ã§ã³ã®æ§é ãå®å
šã«ç°ãªãå¯èœæ§ããããŸãã ããããèªç±ã®ä»£ããã«ãããã¯éåžžãæ··åæŠå¿µãæå³ããŸããã
ã³ã³ããŒãã³ãã¢ãããŒã
Angular 2ã®ã³ã³ããŒãã³ããšã¯äœã§ããïŒ ããã¯ãç¹å®ã®ã¡ã¿ããŒã¿ãšé¢é£ãããã¬ãŒã³ããŒã·ã§ã³ã¬ã€ã€ãŒïŒãã³ãã¬ãŒãïŒãæã€ã¯ã©ã¹ã§ãã ã¯ã©ã¹ããã³ã³ããŒãã³ããäœæããã«ã¯ããããã®éåžžã«å
·äœçãªã¡ã¿ããŒã¿ã远å ããå¿
èŠããããŸãã æãç°¡åãªæ¹æ³ã¯ããã¥ãŒãViewModelïŒã€ãŸãã¯ã©ã¹èªäœïŒã«ãã€ã³ããã@Component
ãã³ã¬ãŒã¿ã§ã©ããããããšã§ãã ãŸããã¿ã€ãéå±€ã®èгç¹ããèŠããšãã³ã³ããŒãã³ãã¯ãã£ã¬ã¯ãã£ãã®ç¹æ®ãªã±ãŒã¹ïŒ @Directive
ãã³ã¬ãŒã¿ãŒã䜿çšããŠæ±ºå®ãããŸãïŒã§ããããã³ãã¬ãŒãããããŸãã
@Component({ selector: 'app', template: `<h1>Hello, {{ greetings }}</h1>` }) export class AppComponent { greetings: string = 'World'; }
ãªããžã§ã¯ãããã³ã¬ãŒã¿ã«æž¡ãå¿
èŠããããŸãããã³ã¬ãŒã¿ã«ã¯ã selector
ãštemplate
å°ãªããšã2ã€ã®å¿
é ãã£ãŒã«ããå«ãŸããŠããå¿
èŠããããŸãã
selector
ãã£ãŒã«ãã«ã¯ãDOMå
ã®ã³ã³ããŒãã³ããæ€çŽ¢ããããã®CSSã»ã¬ã¯ã¿ãšããŠäœ¿çšãããæååãå«ãŸããŠããŸãã ä»»æã®æå¹ãªã»ã¬ã¯ã¿ãŒãæž¡ãããšãã§ããŸãããã»ãšãã©ã®å ŽåãHTMLã¿ã°ã®æšæºã»ããã®äžéšã§ã¯ãªãã»ã¬ã¯ã¿ãŒã¿ã°ã䜿çšããŸãã ãã®ããã«ããŠãã«ã¹ã¿ã ã¿ã°ãäœæãããŸãã
template
ãã£ãŒã«ãã«ã¯template
ã¹ããªã³ã°ãå«ãŸããŠãããã»ã¬ã¯ã¿ãŒã§æ€åºãããDOMèŠçŽ ã®ã³ã³ãã³ãã眮ãæããŸãã ãã³ãã¬ãŒããå«ãè¡ã®ä»£ããã«ããã³ãã¬ãŒããã¡ã€ã«ãžã®ãã¹ãå«ãè¡ãæž¡ãããšãã§ããŸãïŒãã£ãŒã«ãã®ã¿templateUrl
ãšåŒã°ããŸãïŒã ãã³ãã¬ãŒãã®æ§æã®è©³çްã«ã€ããŠã¯ãããã¯ã®ããŒãžãŸãã¯ãã·ã¢èªã®ç¿»èš³ã åç
§ããŠãã ãã ã
ã³ã³ããŒãã³ãéå±€
æåã®æ ŒçŽåº«ã§äœãæªãã£ãã®ã§ããïŒ ã¹ã³ãŒãã®éå±€ããããŸãããããµãŒãã¹å±€ã¯ãã¹ãŠã«å
±éã§ããã ãµãŒãã¹ã¯ãã¢ããªã±ãŒã·ã§ã³ã®èµ·ååã«äžåºŠã ãã»ããã¢ãããããã·ã³ã°ã«ãã³ã§ãããããŸããã
ã«ãŒã¿ãŒã«ã¯ãŸã åé¡ããããŸããã ãªãªãžãã«ã¯ããªã貧匱ã§ãéåžžã®éå±€ãäœæã§ããŸããã§ããã UIã«ãŒã¿ãŒã¯æ©èœãè±å¯ã§ãè€æ°ã®ãã¥ãŒã䜿çšã§ããç¶æ
ã®éå±€ãæ§ç¯ã§ããŸããã
ããããäž¡æ¹ã®ã«ãŒã¿ãŒã®äž»ãªåé¡ã¯ããã®ãã¹ã®éå±€å
šäœãã¹ã³ãŒãã®éå±€ã«ãŸã£ããæ¥ç¶ãããŠããããéåžžã«æè»ã§ãããšããããšã§ãã
2çªç®ã®ããŒãžã§ã³ã¯äœãããŸãããïŒ ç§ãèšã£ãããã«ã2çªç®ã®è§åºŠã®åºæ¬ã¯ã³ã³ããŒãã³ãã§ãã ã¢ããªã±ãŒã·ã§ã³å
šäœã¯ãããªãŒã®ãããªéå±€æ§é ã圢æããã³ã³ããŒãã³ãã®ã¿ã§æ§æãããŠããŸãã ã«ãŒãã³ã³ããŒãã³ãã¯ãããŒãã¹ãã©ããæ©èœã䜿çšããŠHTMLããŒãžã«èªã¿èŸŒãŸããŸãïŒãã©ãŠã¶ãã¿ãŒã²ãããã©ãããã©ãŒã ãšããŠäœ¿çšãããŠããå ŽåïŒã ä»ã®ãã¹ãŠã®ã³ã³ããŒãã³ãã¯ã«ãŒãå
ã«é
眮ãããã³ã³ããŒãã³ãã®ããªãŒã圢æããŸãã
ã³ãŒãã®éè€ãé¿ããªãããåã³ã³ããŒãã³ããã§ããã ãç¬ç«ããåå©çšå¯èœã§ãèªçµŠèªè¶³ã§ããããã«ããæ¹æ³ã¯ïŒ
ã³ã³ããŒãã³ãã®ç¬ç«æ§ã確ä¿ããããã«ããã®ã³ã³ããŒãã³ããæ©èœããããã«å¿
èŠãªãã¹ãŠã®ãã®ãå®å
šã«èšè¿°ããããšãã§ããã¡ã¿ããŒã¿ããããŸãïŒã«ãŒãã£ã³ã°ã®èšå®ããã£ã¬ã¯ãã£ãã®ãªã¹ãã䜿çšããããã€ãããã³ãµãŒãã¹ã ãµãŒãã¹å±€ãä»ããŠæ¥ç¶ãããªãããã«ãåã³ã³ããŒãã³ãã«ã¯ç¬èªã®ã«ãŒã¿ãŒãšç¬èªã®ã€ã³ãžã§ã¯ã¿ãŒããããŸãã ãããŠããããã¯ãŸããéå±€ã圢æããããã¯åžžã«ã³ã³ããŒãã³ãã®éå±€ã«é¢é£ä»ããããŸãã
ããããAngular2ã®DIãä»ã®DIãã¬ãŒã ã¯ãŒã¯ãšåºå¥ãããã®ã§ããæ ŒçŽåº«ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã«1ã€ã®ã€ã³ãžã§ã¯ã¿ãŒããªããåã³ã³ããŒãã³ããç¬èªã®ã€ã³ãžã§ã¯ã¿ãŒãæã€ããšãã§ããŸã
Angular2ã®äŸåæ§æ³šå
¥
äŸåæ§æ³šå
¥ã¯ã2çªç®ã®è§åºŠã§ã©ã®ããã«èŠããŸããïŒ çŸåšããµãŒãã¹ã¯ã¿ã€ãããšã«å®è£
ãããŠããŸãã éåžžãå®è£
ã¯ã³ã³ã·ã¥ãŒããŒã³ã³ã¹ãã©ã¯ã¿ãŒã§è¡ãããŸãã
ãµãŒãã¹
Angular 2ã®ãµãŒãã¹ã¯åçŽãªã¯ã©ã¹ã§ãã
interface User { username: string; email: string; } export class UserService { getCurrent(): User { return { username: 'Admin', email: 'admin@example.com' }; } }
ãµãŒãã¹ç»é²
ãµãŒãã¹ãå®è£
ããã«ã¯ããŸãç»é²ããå¿
èŠããããŸãã ã€ã³ãžã§ã¯ã¿ãŒãæåã§äœæããå¿
èŠã¯ãããŸããã bootstrap
颿°ãåŒã³åºããããšãã¢ã³ã°ã«èªèº«ãã°ããŒãã«ã€ã³ãžã§ã¯ã¿ãŒãäœæããŸãã
bootstrap(AppComponent);
2çªç®ã®åŒæ°ã«ã¯ããããã€ããŒãå«ãé
åãæž¡ãããšãã§ããŸãã ãããã£ãŠããµãŒãã¹ã䜿çšå¯èœã«ãã1ã€ã®æ¹æ³ã¯ããã®ã¯ã©ã¹ããªã¹ãã«è¿œå ããããšã§ãã
bootstrap(AppComponent, [UserService]);
ãã®ã³ãŒãã«ãããã¢ããªã±ãŒã·ã§ã³å
šäœã§ãµãŒãã¹ãå©çšã§ããããã«ãªããŸãã ãã ãããããè¡ãããšã¯åžžã«è¯ããšã¯éããŸããã ãã¬ãŒã ã¯ãŒã¯ã®éçºè
ã¯ãã·ã¹ãã å
šäœã§å¿
èŠãªå Žåã«ã®ã¿ããã®å Žæã«ã·ã¹ãã ãããã€ããŒã®ã¿ãç»é²ããããšããå§ãããŸãã ããšãã°ãã«ãŒã¿ãŒããã©ãŒã ãããã³HttpãµãŒãã¹ã®ãããã€ããŒã
ãµãŒãã¹ãç»é²ãã2çªç®ã®æ¹æ³ã¯ããããã€ããŒãã£ãŒã«ãã®ã³ã³ããŒãã³ãã¡ã¿ããŒã¿ã«è¿œå ããããšã§ãã
import {Component} from 'angular2/core'; import {bootstrap} from 'angular2/platform/browser'; @Component({ selector: 'app', providers: [UserService], template: `<h1>App</h1>`, }) export class AppComponent { } bootstrap(AppComponent);
ã³ã³ããŒãã³ããžã®ãµãŒãã¹ã®åã蟌ã¿
ãµãŒãã¹ãå®è£
ããæãç°¡åãªæ¹æ³ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããããšã§ãã TypeScriptã¯åããµããŒããããããæ¬¡ã®ããã«èšè¿°ããŸãã
@Component({ selector: 'app', providers: [UserService], template: ` <h1>App</h1> Username: {{ user.username }} <br> Email: {{ user.email }} `, }) export class AppComponent { user: User; constructor(userService: UserService) { this.user = userService.getCurrent(); } } bootstrap(AppComponent);
ããã ãã§ãïŒ UserService
ç»é²ããUserService
ããå Žåãangularã¯å¿
èŠãªã€ã³ã¹ã¿ã³ã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒåŒæ°ã«æ¿å
¥ããŸãã
ãµãŒãã¹ãžã®ãµãŒãã¹ã®å±é
ãµãŒãã¹ãäŸåé¢ä¿èªäœã泚å
¥ããã«ã¯ã @Injectable
ãã³ã¬ãŒã¿ã§ãµãŒãã¹ãã©ããããå¿
èŠããããŸãã éçºè
ã¯ããã¹ãŠã®ãµãŒãã¹ã«ãã®ãã³ã¬ãŒã¿ã远å ããããšããå§ãããŸãããµãŒãã¹å
ã®äŸåé¢ä¿ãå¿
èŠã«ãªããã©ããããããªãããã§ãã ã ãã圌ãã®ã¢ããã€ã¹ã«åŸã£ãŠãã ããã
import {Injectable} from 'angular2/core'; @Injectable() // export class Logger { logs: string[] = []; log(message: string) { this.logs.push(message); console.log(message); } } @Injectable() // export class UserService { constructor(private _logger: Logger) {} // getCurrent() { this._logger.log(' ...'); return { username: 'Admin', email: 'admin@example.com' }; } }
Logger
ãµãŒãã¹ãç»é²ããããšãå¿ããªãã§ãã ãããããããªããšãè§åºŠããšã©ãŒãã¹ããŒããŸãã
EXCEPTION: No provider for Logger! (AppComponent -> UserService -> Logger)
ãã®ããã Logger
ãã³ã³ããŒãã³ããããã€ããŒã®ãªã¹ãã«è¿œå ããŸãã
providers: [UserService, Logger],
ãªãã·ã§ã³ã®äŸåé¢ä¿
å®è£
ããããµãŒãã¹ããªãã·ã§ã³ã®å Žåã @Optional
ã¢ãããŒã·ã§ã³ã远å ããå¿
èŠããããŸãã
import {Optional, Injectable} from 'angular2/core'; @Injectable() // export class UserService { constructor(@Optional() private _logger: Logger) {} // getCurrent() { this._logger.log(' ...'); return { username: 'Admin', email: 'admin@example.com' }; } }
Logger
ç»é²ãå¿ããå Žåã§ãããšã©ãŒã¯çºçããŸããã
ãããã€ããŒ
ãããã€ããŒã¯ãå®è¡æã«å®è£
ããããµãŒãã¹ã®ç¹å®ã®ããŒãžã§ã³ãæäŸããŸãã å®éããµãŒãã¹èªäœã§ã¯ãªãããããã€ããŒãåžžã«ç»é²ããŠããŸãã ã»ãšãã©ã®å Žåããããã¯äžèŽããŸãã
ãã¬ãŒã ã¯ãŒã¯ã«ã¯Provider
ã¯ã©ã¹ãããProvider
ã ã€ã³ãžã§ã¯ã¿ãŒãäŸåé¢ä¿ãã€ã³ã¹ã¿ã³ã¹åããæ¹æ³ã説æããŸãã
ãããã€ããŒã®ãªã¹ãïŒã³ã³ããŒãã³ããŸãã¯ããŒãã¹ãã©ãã颿°ïŒã«ãµãŒãã¹ã¯ã©ã¹ã远å ãããšããå®éã«ã¯ãããã¯æ¬¡ã®ããšãæå³ããŸãã
[Logger], // [new Provider(Logger, {useClass: Logger})], // , provide [provide(Logger, {useClass: Logger})],
Provider
ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãšprovide
颿°ã¯ãã©ã¡ãã2ã€ã®åŒæ°ãåããŸãã
- ãµãŒãã¹ãã±ãŒã¿ãŒãäŸåé¢ä¿ãæ€çŽ¢ããããŒãšããŠæ©èœããããŒã¯ã³
- åã蟌ã¿å€ã®äœææ¹æ³ã«é¢ããã¬ã·ããå«ããªããžã§ã¯ã
å®éãå®è£
ãã¿ã€ãããšã«è¡ããããšèšã£ããšããç§ã¯å®å
šãªçå®ãäŒããŸããã§ããã å®è£
ãè¡ãããšãã§ããããŒã¯ã³ã¯ãã¯ã©ã¹ã ãã§ãªããåŸã§ãã以äžã«ããããšãã§ããŸãã
代æ¿ãµãŒãã¹ãããã€ããŒ
Logger
ã¯ã©ã¹ã®ä»£ããã«BetterLogger
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ããµãŒãã¹ãšããŠäœ¿çšãããšããŸãã ã¢ããªã±ãŒã·ã§ã³å
šäœã§BetterLogger
Logger
äŸåé¢ä¿ãæ€çŽ¢ããã³å€æŽããå¿
èŠã¯ãããŸããuseClass
ãªãã·ã§ã³ã䜿çšããŠLogger
ãããã€ããŒãç»é²ããã ãã§ãã
[provide(Logger, {useClass: BetterLogger})]
代æ¿ã¯ã©ã¹ã«ãå
ã®ãµãŒãã¹ã«ã¯ãªãããçš®ã®äŸåé¢ä¿ãããå Žåã§ãïŒ
@Injectable() class EvenBetterLogger { logs:string[] = []; constructor(private _timeService: TimeService) { } log(message: string) { message = `${this._timeService.getTime()}: ${message}`; console.log(message); this.logs.push(message); } }
ãšã«ãããç°¡åã«äœ¿çšã§ããŸããå¿
èŠãªäŸåé¢ä¿ãç»é²ããã ãã§ãã
[ TimeService, provide(Logger, {useClass: EvenBetterLogger}) ]
ãããã€ããŒã®ãšã€ãªã¢ã¹
å€ãOldLogger
ãã¬ãŒOldLogger
äŸåããå€ãã³ã³ããŒãã³ãããããšããŸãã ãã®ãµãŒãã¹ã«ã¯ãæ°ããNewLogger
ãã¬ãŒãšåãã€ã³ã¿ãŒãã§ãŒã¹ããããŸãã ããããäœããã®çç±ã§ããã®å€ãã³ã³ããŒãã³ãã倿Žããããšã¯ã§ããŸããã ãããã£ãŠãå€ããã¬ãŒã®ä»£ããã«æ°ãããã®ãå¿
èŠã§ãã ãããè¡ãããšãããšïŒ
[ NewLogger, provide(OldLogger, {useClass: NewLogger}) ]
ããã¯ç§ãã¡ãæãã§ãããã®ã§ã¯ãããŸãããæ°ãããã¬ãŒã®2ã€ã®ã³ããŒãäœæãããŸãã 1ã€ã¯å€ããã®ãå®è£
ãããŠããå Žæã§äœ¿çšããããã1ã€ã¯æ°ãããã¬ãŒãå°å
¥ãããŠããå Žæã§äœ¿çšãããŸãã ã©ãã§ã䜿çšãããæ°ãããã¬ãŒã®ã€ã³ã¹ã¿ã³ã¹ã1ã€ã ãäœæããã«ã¯ã useExisting
ãªãã·ã§ã³ã§ãããã€ããŒãç»é²ããŸãã
[ NewLogger, provide(OldLogger, {useExisting: NewLogger}) ]
ããªã¥ãŒãããã€ããŒ
ãµãŒãã¹ãããã€ããŒã眮ãæããããã«å¥ã®ã¯ã©ã¹ãäœæããã®ã§ã¯ãªããæ¢æã®å€ã䜿çšããæ¹ãç°¡åãªå ŽåããããŸãã äŸïŒ
// , , Logger let silentLogger = { logs: ['Silent logger says "Shhhhh!". Provided via "useValue"'], log: () => {} }
æ¢è£œã®ãªããžã§ã¯ãã䜿çšããã«ã¯ã useValue
ãªãã·ã§ã³ã䜿çšããŠãããã€ããŒãç»é²ããŸãã
[provide(Logger, {useValue: silentLogger})]
å·¥å Žãããã€ããŒ/å·¥å Žãããã€ããŒ
æåããå
¥æã§ããªãæ
å ±ã䜿çšããŠããããã€ããŒãåçã«ç»é²ããå¿
èŠãããå ŽåããããŸãã ããšãã°ããã®æ
å ±ã¯ã»ãã·ã§ã³ããååŸã§ããæã
ç°ãªãå ŽåããããŸãã ãŸããå®è£
ããããµãŒãã¹ã¯ãã®æ
å ±ã«ç¬ç«ããŠã¢ã¯ã»ã¹ã§ããªããšæ³å®ããŠããŸãã
ãã®ãããªå Žåã¯ãå·¥å Ž/å·¥å Žãããã€ããŒã䜿çšããŠãã ããã
EvenBetterLogger
ããã«ãå¥ã®ãµãŒãã¹ããã®æ
å ±ãå¿
èŠãšããç¹å®ã®BookService
ãµãŒãã¹ãEvenBetterLogger
ãŸãããã AuthService
ããŒã¿ã䜿çšããŠãŠãŒã¶ãŒãæ¿èªãããŠãããã©ããã確èªãããšããŸãã ãããã EvenBetterLogger
ãšã¯ç°ãªãããµãŒãã¹ãçŽæ¥å®è£
ããããšã¯ã§ããŸããã ãã®å Žåã BookService
ã¯AuthService
ã¢ã¯ã»ã¹ã§ããŸããã ãµãŒãã¹ã¯æ¬¡ã®ããã«ãªããŸãã
@Injectable() export class AuthService { isLoggedIn: boolean = false; } @Injectable() export class BookService { books: any[]; // , extraBooks: any[]; // , constructor(private _logger: Logger, private _isLoggedIn: boolean) {} getBooks() { if (this._isLoggedIn) { this._logger.log(' '); return [...this.books, ...this.extraBooks]; } this._logger.log(' '); return this.books; } }
Logger
, boolean-.
- BookService
, :
let bookServiceFactory = (logger: Logger, authService: AuthService) => { return new BookService(logger, authService.isLoggedIn); }
, , useFactory
, deps
â :
[provide(BookService, {useFactory: bookServiceFactory, deps: [Logger, AuthService]})
- , , . , . , :
let logger: Logger = this._injector.get(Logger);
, - :
constructor(private _logger: Logger) {}
.
? , , , ..
, -, . , , - :
export interface Config { apiEndpoint: string, title: string } export const CONFIG: Config = { apiEndpoint: 'api.heroes.com', title: 'Dependency Injection' };
, . :
// FAIL [provide(Config, {useValue: CONFIG})] // FAIL constructor(private _config: Config) {}
: .
, Java C# ( DI- ), . . , JavaScript. , interface
â TypeScript, . , .
åé¡è§£æ±º
OpaqueToken
, - :
import {OpaqueToken} from 'angular2/core'; export let APP_CONFIG = new OpaqueToken('app.config');
OpaqueToken
, .
:
providers: [provide(APP_CONFIG, {useValue: CONFIG})]
, @Inject
:
constructor(@Inject(APP_CONFIG) private _config: Config) {}
, , .
, :
[provide('Congig', {useValue: CONFIG})] //... constructor(@Inject('Config') private _config: Config) {}
, Angular2- â . . .
? , -, , . , - , . , - . , providers
.
, . - - . , - . . , : , . .
, . . , , .
? providers
, . , bootstrap
.
providers
, Injector.resolveAndCreate([...])
, . parent
, . , . , .
, :
ã³ãŒã import {bootstrap} from 'angular2/platform/browser'; import {Injectable, Component} from 'angular2/core'; @Injectable() class LoggerA { logs: string[] = []; log(message: string) { this.logs.push(message); console.log('Logger a: ' + message); } } @Injectable() class LoggerB { logs: string[] = []; log(message: string) { this.logs.push(message); console.log('Logger b: ' + message); } } @Component({ selector: 'child', providers: [LoggerA], template: ` <div> <h4>Child</h4> <button (click)="update()">Update</button> <p>Logs:</p> <strong>LogA: <pre>{{ logA.logs | json }}</pre></strong> <strong>LogB: <pre>{{ logB.logs | json }}</pre></strong> </div>` }) export class ChildComponent { constructor(public logA: LoggerA, public logB: LoggerB) {} update() { this.logA.log('Child: A'); this.logB.log('Child: B'); } } @Component({ selector: 'app', providers: [LoggerA, LoggerB], directives: [ChildComponent], template: ` <div> <div style="display: inline-block; vertical-align: top;"> <h3>App</h3> <button (click)="update()">Update</button> <p>Logs:</p> <strong>LogA: <pre>{{ logA.logs | json }}</pre></strong> <strong>LogB: <pre>{{ logB.logs | json }}</pre></strong> </div> <div style="display: inline-block; vertical-align: top;"> <child></child> </div> </div>` }) export class AppComponent { constructor(public logA: LoggerA, public logB: LoggerB) {} update() { this.logA.log('App: A'); this.logB.log('App: B'); } } bootstrap(AppComponent);
http://plnkr.co/edit/nbpmh3wb5g34WetQ3AAE?p=preview
2 2 . 2 ( LoggerA
LoggerB
), â LoggerA
. Update
, LogB
, , LoggerB
, . LoggerA
. , â .
, Angular2 ? 1- . , .
çµè«
- Angular 2 ,
OpaqueToken
', . - -. - ,
OpaqueToken
. - , Angular2- .
- . .
- , .
- .
:
- . .
bootstrap
. - .
- , .
- ( ) -.
OpaqueToken
. - - , . , .