
ããæè¿ïŒ3æ5ã6æ¥ïŒ ng-confäŒè°ãéå¬ãããAngular 2ã®ä»åŸã®ãªãªãŒã¹ã«é¢ããå€ãã®å ±åãè¡ãããŸããã ãã¡ãããèããåŸãç§ã¯æ¬åœã«å人çã«è©ŠããŠã¿ããã£ãã§ãã åŸ ã¡ãããªããªããç«ããé¡ãããŸãã
ãã®èšäºã§ã¯ãAngular 2.0ãã«ãã®ã¢ã«ãã¡çã®å ¥æå ãèŠã€ãããã®äžã«å°ããªTo Doãªã¹ãã¢ããªã±ãŒã·ã§ã³ãäœæããECMAScript 6ãå®å šã«ãµããŒãããã«ãã©ãŠã¶ãŒã§èµ·åããŸãã
Angular 2ã¯çŸåšã®ããŒãžã§ã³ãšã¯å€§ããç°ãªããã»ãšãã©ãã¹ãŠãåèãããŠããŸãã éãã®å€ãã¯ã圌ãã¢ãããŒã·ã§ã³ãšã¿ã€ããåããES6ãæ倧éã«äœ¿çšããŠãããšããäºå®ã«ç±æ¥ããéçºè ã¯ãã®èšèªãAtScriptãšåŒã³ãŸãã ã©ããããAngularããŒã ã¯Microsoftãšç·å¯ã«é£æºãå§ãã TypeScriptã§éçºãè¡ãããããŒãžã§ã³1.5ã®ãªãªãŒã¹åŸãAtScriptãå®å šã«å«ãŸããããã«ãªããŸããã
Angular 2ã¢ããªã±ãŒã·ã§ã³ã¯ãã³ã³ããŒãã³ãã§æ§æãããããªãŒã«ãªããŸããã ãã®èãæ¹ã¯Webã³ã³ããŒãã³ããšäŒŒãŠãããAngular 2ã³ã³ããŒãã³ãã®ããŒã¯ã¢ãããShadow DOMã«é 眮ãããŸãã ããã«ãã¢ããªã±ãŒã·ã§ã³ã§Webã³ã³ããŒãã³ãããŸãã¯ããšãã°Polymerã䜿çšããå Žåãæ§æã¯ç¬èªã®Angular 2ã³ã³ããŒãã³ãã䜿çšããå Žåãšå€ãããŸããã ã³ã³ããŒãã³ãèªäœã¯æ³šéä»ãã®ES6ã¯ã©ã¹ã§ãããããšãã°ããŒãžã§ã³1.xã®ãã£ã¬ã¯ãã£ãã®å Žåãç¹å¥ãªæ§æã¯å¿ èŠãããŸããã ãµãŒãã¹ãéåžžã®ã¯ã©ã¹ã«ãªããAtScriptã§ã®å ¥åã®ãµããŒãã®ãããã§ãæ§æã䜿çšããã«ãã¿ã€ãããšã«ãµãŒãã¹ãæ¿å ¥ã§ããŸã$ InjectãŸãã¯ngAnnotateã
ã§ã¯ãæåã®To-doã¢ããªã±ãŒã·ã§ã³ãäœæããŠã¿ãŸãããããã®éçšã§ãäœãã©ã®ããã«ç解ããã®ã§ããããã
çŸåšãAngular 2ãæ©èœããããã«å¿ èŠãªãã¹ãŠã®æ©èœããµããŒããããã©ãŠã¶ã¯ãªãããã次ã®ãããªããŒã«ãå¿ èŠã§ãã
- rtts-assert
- es6-shim
- System.js
- Zone.js
- 泚éããµããŒããããªãã·ã§ã³ãåãããã¬ãŒãµãŒ
éçºè ã¯ãã¢ã«ãã¡çããã¹ãŠåå¥ã«èšå®ããå¿ èŠããªããšæãããã¹ãŠã®äººã«ãã¯ã€ãã¯ã¹ã¿ãŒãããŸãšããŸããã ãããžã§ã¯ããã©ã«ããŒã«å ¥åããããšã§ã€ã³ã¹ããŒã«ã§ããŸãã
git clone https://github.com/angular/quickstart.git
å¿ èŠãªãã®ã¯ãã¹ãŠã¯ã€ãã¯ã¹ã¿ãŒããã©ã«ããŒã«ãããçŸããã®ããã«angle -materialãè¿œå ããŸããããã¡ããããããcssã®ã¿ã䜿çšããŸãïŒ
bower install angular-material
次ã«ããããžã§ã¯ãã«index.htmlãã¡ã€ã«ãäœæããŸãã
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>To Do</title> <script src="/quickstart/dist/es6-shim.js"></script> <link href="bower_components/angular-material/angular-material.css" rel="stylesheet" /> </head> <body layout="row"> <style> md-progress-circular.md-default-theme.blue .md-inner .md-right .md-half-circle { border-right-color: #039be5; } md-progress-circular.md-default-theme.blue .md-inner .md-left .md-half-circle, md-progress-circular.md-default-theme .md-inner .md-right .md-half-circle { border-top-color: #039be5; } md-progress-circular.md-default-theme.blue .md-inner .md-left .md-half-circle { border-left-color: #039be5; } md-progress-circular.md-default-theme.blue .md-inner .md-gap { border-top-color: #039be5; border-bottom-color: #039be5; } </style> <app flex layout="row" layout-fill> <div layout-fill layout="row" layout-align="center center" layout-margin> <md-progress-circular md-mode="indeterminate" class="md-default-theme blue" style="-webkit-transform: scale(1);"> <div class="md-spinner-wrapper"> <div class="md-inner"> <div class="md-gap"> </div> <div class="md-left"> <div class="md-half-circle"></div> </div> <div class="md-right"> <div class="md-half-circle"></div> </div> </div> </div> </md-progress-circular> <h4> To do app is loading... </h4> </div> </app> <script> System.paths = { 'angular2/*': 'quickstart/angular2/*.js', 'rtts_assert/*': 'quickstart/rtts_assert/*.js', 'app/*': 'app/*.js' }; System.import('app/App'); </script> </body> </html>
ããã§ã¯ã次ã®3ã€ã®ç¹ã«æ³šæããå¿ èŠããããŸãã
ãŸãães6-shimãã¡ã€ã«ãå«ããŸãããã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããã«å¿ èŠãªäžèšã®ãã¹ãŠã泚ææ·±ãåéããŸããã
次ã«ãã¢ããªèŠçŽ ã«æ³šæããŠãã ããã ãããã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã³ã³ããŒãã³ãã«ãªããŸãã ããã§ãã¹ãããŒãšããŒã¯ã¢ãããå«ãŸããTo Doã¢ããªã®ç¢æãèªã¿èŸŒãŸããŸã...è§åºŠãã³ã³ããŒãã³ãã¯ã©ã¹ãèªã¿èŸŒã¿ããã®ããŒã¯ã¢ããããã³ãã¬ãŒãã§çœ®ãæãããŸã§è¡šç€ºãããŸãã
äžçªäžã§ã¯ãsystem.jsã©ã€ãã©ãªã䜿çšããŸãããããã¯ãES6ã¢ãžã¥ãŒã«ããŒãã·ã¹ãã ãå®è£ ããŠããŸãã æåã«ãSystem.pathsã䜿çšããŠã.jsãã¡ã€ã«ãžã®ãã¹ãæ§æãã次ã«System.importã䜿çšããŠãã¢ããªã³ã³ããŒãã³ããšå ±ã«ãã¡ã€ã«ãããŠã³ããŒãããŸããã次ã«ãå¿ èŠãªãã¹ãŠã®ã©ã€ãã©ãªãšã³ã³ããŒãã³ããååŸããŸãã
次ã«ãã¢ããªãã©ã«ããŒãäœæããApp.jsãã¡ã€ã«ããã®äžã«é 眮ããŸãã
import {Component, Template, bootstrap, Foreach} from 'angular2/angular2'; import {TodoStore} from 'app/TodoStore'; import {ItemEditor} from 'app/ItemEditor'; @Component({ selector: 'app', componentServices: [ TodoStore ] }) @Template({ url: 'app/todo.html', directives: [Foreach, ItemEditor] }) class App { constructor(store:TodoStore) { this.store=store; } } bootstrap(App);
æåã«ãangular2.jsããã³ã³ããŒãã³ãããã³ãã¬ãŒããForeachã¯ã©ã¹ãã€ã³ããŒãããããããããŒãã¹ãã©ããé¢æ°ãã€ã³ããŒãããŸããããŒãžã§ã³1.xã§ng-appãã£ã¬ã¯ãã£ãã䜿çšããŠããªã人ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã³ã³ããŒãã³ããåæåããŠãããã¢ããªã±ãŒã·ã§ã³ããTodoStoreã¯ã©ã¹ãã€ã³ããŒãããŸã/todoStore.jsïŒããã¯ãlocalStorageãã©ãŠã¶ãŒã®ã¿ã¹ã¯ãšãã®ã¹ãã¬ãŒãžã®ãªã¹ããæäœãããµãŒãã¹ã§ãïŒããã³app / item-editor.jsã®ItemEditorïŒããã¯ã³ã³ããŒãã³ã-ãªã¹ãã¢ã€ãã ã衚瀺ãããã£ã¬ã¯ãã£ãïŒã§ãã ãŸã ããããæžããŠããªãã®ã§ãåŸã§ã¬ãã¥ãŒããŸãã
次ã«ãAppã¯ã©ã¹ãäœæããŸããTodoStoreã¯ã©ã¹ã®ãªããžã§ã¯ãã¯ãstoreããããã£ã«å²ãåœãŠãã€ã³ãžã§ã¯ã¿ãŒã䜿çšããŠæž¡ãããŸãã
ã¯ã©ã¹ã宣èšãããšããangular2.jsã®ã³ã³ããŒãã³ããšãã³ãã¬ãŒãã®ã¢ãããŒã·ã§ã³ã䜿çšããŸããã
ã³ã³ããŒãã³ã-ã¯ã©ã¹ãã³ã³ããŒãã³ãã«ãã泚éã ã»ã¬ã¯ã¿ãŒããããã£ã¯ããã³ãã¬ãŒãã®ã¬ã€ã¢ãŠãå ã®èŠçŽ ãæ€åºã§ããã»ã¬ã¯ã¿ãŒã§ãããã®ã¢ããªèŠçŽ ããããŸãã componentServicesããããã£ã¯ãã€ã³ãžã§ã¯ã¿ãŒã®ã¯ã©ã¹ã®ãªã¹ãã§ãã
ãã³ãã¬ãŒã-ã³ã³ããŒãã³ãã®ãã³ãã¬ãŒããæå®ããã®ã«åœ¹ç«ã¡ãŸãã urlããããã£ã¯ãã³ãã¬ãŒããé 眮ããããã¹ã瀺ããdirectivesããããã£ã¯ãã®ãã³ãã¬ãŒãã®ããŒã¯ã¢ããã§äœ¿çšããããã£ã¬ã¯ãã£ãã®ãªã¹ãã瀺ããŸãã
ãã¡ã€ã«ã®æåŸã§ãããŒãã¹ãã©ããé¢æ°ã䜿çšããŠã¡ã€ã³ã³ã³ããŒãã³ããåæåããŸãã
app / TodoStore.jsãã¡ã€ã«ãäœæããŸãããïŒ
export class TodoStore { constructor() { this.load(); } save() { window.localStorage['todoItems']=JSON.stringify(this.items); } addItem(name, checked) { this.items.push(new Item(name,checked)); } clear() { this.items.length=0; } load() { this.items=[]; let itemsStr=window.localStorage['todoItems']; if(itemsStr) { JSON.parse(itemsStr).forEach((e) => { this.addItem(e.name, e.checked); }); } } } class Item { constructor (name, checked){ this.name = name; this.checked=checked || false; } toggleCheck() { this.checked=!this.checked; } }
TodoStoreã¯ã©ã¹ã«ã¯ãsaveïŒïŒãloadïŒïŒãclearïŒïŒãaddItemïŒnameãcheckedïŒã®ã¡ãœããããããŸãã
ã¿ã¹ã¯ãªã¹ãèªäœã¯ãitemsããããã£ã«ä¿åãããŸãã saveïŒïŒã¡ãœããã¯ãitemsããããã£ã®å€ãlocalStorageã«ä¿åããŸãã clearïŒïŒã¡ãœããã¯ãitemsããããã£ãã¯ãªã¢ããŸãã loadïŒïŒã¡ãœããã¯ããªã¹ãå ã®ãã¹ãŠã®ã¢ã€ãã ãlocalStorageããããŒãããaddItemã¡ãœããã䜿çšããŠã¢ã€ãã ã«è¿œå ããŸãã addItemïŒnameãcheckedïŒã¡ãœããã¯ãªã¹ãã¢ã€ãã ã®ååãååŸããæ°ããItemãªããžã§ã¯ããäœæããŠãããItemsã«è¿œå ããŸãã
次ã¯Itemã¯ã©ã¹ã®å®£èšã§ããã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãååïŒãªã¹ãé ç®ã®ååã§ããããã§ãã¯æžã¿ïŒãå®äºãšããŠããŒã¯ãããŠãããã©ãããåãåããŸãã ãã®ã¯ã©ã¹ã«ã¯ãcheckedå€ãå察ã®å€ã«å€æŽããtoggleCheckïŒïŒã¡ãœããããããŸãã
次ã«ãã¡ã€ã³ã³ã³ããŒãã³ããã³ãã¬ãŒãã§app / todo.htmlãã¡ã€ã«ãäœæããŸãã
<style> @import "../bower_components/angular-material/angular-material.css"; .md-primary { background-color: #039be5; color: white; } md-toolbar { background-color: #CFD8DC; } md-input-container { padding-bottom: 0; } </style> <div flex layout="column" layout-fill layout-margin> <md-toolbar class="md-primary"> <h2 class="md-toolbar-tools"> <span>To do list</span> </h2> </md-toolbar> <md-content layout="row" layout-align="center start" flex> <div flex="50" flex-md="80" flex-sm="100"> <div layout="row" layout-margin flex> <button flex class="md-button md-primary md-raised md-default-theme" (click)="store.save()">Save</button> <button flex class="md-button md-primary md-raised md-default-theme" (click)="store.load()">Load</button> <button flex class="md-button md-primary md-raised md-default-theme" (click)="store.clear()">Clear</button> </div> <div layout="row" layout-margin flex> <md-input-container class="md-input-has-value" flex="60"> <input #newitem class="md-input" placeholder="New to do item" /> </md-input-container> <button flex class="md-button md-primary md-raised md-default-theme" (click)="store.addItem(newitem.value)">Add new item</button> </div> <md-list> <md-item *foreach="#item in store.items"> <md-item-content> <item-editor [item]="item"></item-editor> </md-item-content> </md-item> </md-list> </div> </md-content> </div>
ããã«ã¯ãã¹ãã¢ã¡ãœããstore.saveïŒïŒãstore.loadïŒïŒãstore.clearïŒïŒãåŒã³åºã3ã€ã®ãã¿ã³ããããŸãã ïŒclickïŒå±æ§ã䜿çšããŠãåãã¿ã³ã®ã¯ãªãã¯ã€ãã³ãã«ãã€ã³ãããŸãã è§åºŠã®çŸåšã®ããŒãžã§ã³ã§ã¯ãã€ãã³ãã«ãã€ã³ãããããã«äœ¿çšãããå±æ§ãšãããŒã¿ããã€ã³ãããããã«äœ¿çšãããå±æ§ãããŒã¯ã¢ããã§åºå¥ããã®ãäžèŠå°é£ãªå ŽåããããŸããä»ã§ã¯ãã¹ãŠãããã«è¡šç€ºãããèŠçŽ ãŸãã¯ã³ã³ããŒãã³ãã®ã€ãã³ãã«å¿çããã«ã¯æ¬åŒ§ïŒïŒãå¿ èŠã§ããè§æ¬åŒ§[]ã®å±æ§ã¯ããŒã¿ã«ãã€ã³ããããå±æ§å€ã¯èšç®ãããåŒã§ããããã®çµæã¯èŠçŽ ã®å±æ§ã«å²ãåœãŠãããããšãç解ãããŸããå±æ§ãæ¬åŒ§ãªãã§æå®ãããŠããå Žåã ãã®äžã«ããã¹ãå€ã
次ã«ãïŒnewitemå±æ§ã䜿çšããå ¥åã«æ³šæãæãããšã§ãäžã®ãã¿ã³ã®ã¯ãªãã¯ã€ãã³ãã®ããã«èŠçŽ ã«ååãä»ããããšãã§ããããã«ãªããŸãããå ¥åå€-newitem.valueãååŸããstore.addItemã«æž¡ããŸãã ïŒïŒã
次ã¯ãæ°ãã* foreachãã£ã¬ã¯ãã£ãã䜿çšããŠå°åºããã¿ã¹ã¯ã®ãªã¹ãã§ãïŒããã¯ng-repeatã®ä»£æ¿ã§ãïŒãããã§ã¯ãäžèšã®å ¥åã®ããã«ãitemãšããååã®ãªã¹ãã®åã¢ã€ãã ãåç §ãã#itemãäœæããŸããã
item-editorãã£ã¬ã¯ãã£ãã䜿çšããŠåãªã¹ãé ç®ã衚瀺ãã[item]å±æ§ã䜿çšããŠãªã¹ãé ç®ããã€ã³ãããŸãã
ããã§ãItemEditorã³ã³ããŒãã³ãã䜿çšããŠapp / ItemEditor.jsãã¡ã€ã«ãäœæããŸããããã«ããããªã¹ãã¢ã€ãã ã®è¡šç€ºãè¡ãããŸãã
import {Component, Template} from 'angular2/angular2'; @Component({ selector: 'item-editor', bind: { 'item': 'item' } }) @Template({ inline: ` <style> @import "../bower_components/angular-material/angular-material.css"; md-checkbox.md-checked .md-icon { background-color: #039be5; color: white; } </style> <md-checkbox [class.md-checked]="item.checked" (click)="item.toggleCheck()"> <div class="md-label"> <div class="md-container"> <div class="md-icon"></div> </div> <span> {{item.name}} </span> </div> </md-checkbox> ` }) export class ItemEditor { }
ãã@Componentã§ã¯ããitem-editorãã»ã¬ã¯ã¿ãŒãæå®ããŸãããããã¯ãtodo.htmlã®* foreachã§äœ¿çšãããèŠçŽ ã§ãã bindããããã£ãç¶ããŸããããã¯ãitemå±æ§ã®å€ãã³ã³ããŒãã³ãã¯ã©ã¹ã®é ç®ããããã£ïŒbindToControllerãªã©ïŒã«ãã€ã³ãããå¿ èŠãããããšã瀺ããŸãã
ä»åã®ãã³ãã¬ãŒãã§ã¯ãããšãã°urlã®ä»£ããã«ãã€ã³ã©ã€ã³ããããã£ãæå®ãããŠãããã³ãŒãå ã§ãã³ãã¬ãŒãã®ããã¹ããçŽæ¥æå®ããã®ã«åœ¹ç«ã¡ãŸãã ããã«ãããå¿ èŠãªhttpãªã¯ãšã¹ãã®æ°ãæžãã®ã§ãAngular 2ã®ãªãªãŒã¹åŸãçŸåšã®gulp-angular-templatecacheã眮ãæããããã«ãURLãã€ã³ã©ã€ã³ã«å€æŽããGulpã®ãã©ã°ã€ã³ãããããããã§ãããã
ãã³ãã¬ãŒãèªäœã«ã¯ã[class.md-checked]å±æ§ããããŸã-ããã¯ng-classã®ç°¡æœãªä»£æ¿åã§ãã 以äžã¯ãæ¢ã«ãã€ãã£ãã«ãªã£ãŠããäžæ¬åŒ§{{item.name}}ã䜿çšããæ§æã䜿çšãããªã¹ãã¢ã€ãã ã®ååã§ãã
以äžã§ããããžã§ã¯ããéå§ãïŒChromeã§ã®ã¿ãã§ãã¯ïŒãAngular 2.0ã®å°æ¥ã®åäœã確èªã§ããŸãã
ã芧ã®ãšãããéçºè ã¯Angular.jsã®æŠå¿µãå®å šã«åèããæ°ãããããç°¡æœãªæ§æãåããå®å šã«æ°ãããã¬ãŒã ã¯ãŒã¯ãåŸ ã£ãŠããŸãã 倧èŠæš¡ã¢ããªã±ãŒã·ã§ã³åãã«èšèšããããŸã£ããæ°ããã¢ãŒããã¯ãã£ã®ãããã§ãããŒãžã§ã³1.xã®äž»ãªåé¡ã§ããã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ã¯äœåãåäžããŸãïŒDave Smithã®ã¬ããŒãAngular + React = Speedã®æåŸã«æ確ãªæ¯èŒããããŸãïŒã ã¿ã€ãã³ã°ã䜿çšããæ©èœã¯ãã³ãŒãã®è¿œå ãšéçåæã®é«åºŠãªãµããŒãïŒå°ãªããšãMicrosoftãåªå äºé ã®1ã€ãšããŠVisual Studioã®AngularãµããŒãã䞻匵ããïŒã®IDEã®éçºã®å¯èœæ§ãéããŸãã ãŸããES6ã®é©æ°ã«ãããéçºãããã«é«éã§æ¥œãããªããŸãã
ä»æ¥ãAngular 2.0ã«ã€ããŠåŠãã ããšã¯ã»ãŒãã¹ãŠã§ããåŒãç¶ããã¥ãŒã¹ããã©ããŒããŸãããããã§ã¯ãããã¯ã«é¢ããèå³æ·±ããªã³ã¯ãããã€ãã玹ä»ããŸãã
YouTubeã®ng-confãã£ã³ãã«ã«å€æ°ã®èå³æ·±ãã¬ããŒãããããŸã
Angular 2.0ã®å ¬åŒãµã€ã
GitHubã®Angular 2ãããžã§ã¯ã