Ember.jsã¯ãWebã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ããµã€ããéçºããããã®JavaScriptãã¬ãŒã ã¯ãŒã¯ã§ãããæè¿æ³šç®ãéããŠããéå¿çãªãããžã§ã¯ãã§ãã ä»æ¥ã¯ãEmber.jsã®åºç€ãšãªãéèŠãªæŠå¿µã®ããã€ãã«ã€ããŠã話ãããã·ã³ãã«ãªã¢ããªã±ãŒã·ã§ã³ã®äœæäžã«ããããå®èšŒããŸãã

ããã¯ãµã€ã³ãããŒã©ãŒããã°ã©ã ã§ããµã€ã³ãããããŒã«ããããã©ã¡ãŒã¿ãŒãäºåã«èšå®ãã以åã®ãããŒã«ãã®å±¥æŽã衚瀺ã§ããŸãã 圌女ã®ã³ãŒãã¯
Githubã«ãããŸãã
Ember.jsãã¬ãŒã ã¯ãŒã¯ã«ã¯ãJavaScriptã®äžçã®å€ãã®ææ°ã®ã³ã³ã»ãããšãã¯ãããžãŒãå«ãŸããŠããŸãã ãã®æ©èœã®äžã§ãç§ã¯æ¬¡ã®ããšã«æ³šæããããšæããŸãã
- Babelãã©ã³ã¹ããŒã¿ãŒã䜿çšããŠãES2016ãµããŒããæäŸããŸãã
- ãã¹ãããŒã«Testemããã³QTestã®ãµããŒãã«ãããåäœãã¹ããçµ±åãã¹ããåãå
¥ããã¹ãã®æ©äŒãåºãããŸãã
- Broccoli.jsã³ã¬ã¯ã¿ãŒã®ãµããŒãã
- WebããŒãžã®ã€ã³ã¿ã©ã¯ãã£ããªåèªã¿èŸŒã¿ãéçºããã»ã¹ãé«éåããŸãã
- ãã³ãã«ããŒãã³ãã¬ãŒããšã³ãžã³ã®ãµããŒãã
- äž»ã«URLã«ãŒããäœæããéçºã¢ãã«ã䜿çšããŸãã ããã«ããããã£ãŒããªã³ã¯ãå®å
šã«ãµããŒããããŸãã
- JSON APIã«åºã¥ããŠããŒã¿ãæäœããããã®ã¬ã€ã€ãŒãååšããŸããã䜿çšããå¿
èŠãããAPIãžã®æ¥ç¶ããµããŒãããŸãã
Ember.jsã®äœ¿çšãéå§ããã«ã¯ãNode.jsãšnpmã®ææ°ããŒãžã§ã³ãå¿
èŠã§ãã ããã¯ãã¹ãŠ
Node.jsããããŠã³ããŒãã§ããŸã
ãããã«ãEmber.jsã¯ããã³ããšã³ãæåã®ãã¬ãŒã ã¯ãŒã¯ã§ãããšèšã䟡å€ããããŸãã ããŸããŸãªããã¯ãšã³ããšå¯Ÿè©±ããå€ãã®æ¹æ³ããµããŒãããŠããŸããããµãŒããŒã³ãŒãã«é¢é£ãããã¹ãŠã®ããšã¯Emberã®è²¬ä»»ã§ã¯ãããŸããã
ember-cliã®çŽ¹ä»

Ember.jsã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹
ember-cli
ã¯ããã®ãã¬ãŒã ã¯ãŒã¯ã®å€ãã®æ©èœãžã®ã¢ã¯ã»ã¹ãæäŸããŸãã
Ember-cli
ã¯ãäœæ¥ã®ãã¹ãŠã®æ®µéã§ããã°ã©ããŒããµããŒãããŸãã ã¢ããªã±ãŒã·ã§ã³ã®äœæãæ©èœã®æ¡åŒµããã¹ãããã³éçºã¢ãŒãã§ã®ãããžã§ã¯ãã®èµ·åãç°¡çŽ åããŸãã
Emberã¢ããªã±ãŒã·ã§ã³ã®äœæäžã«è¡ãããšã®ã»ãšãã©ãã¹ãŠã«ãããçšåºŠãŸã§
ember-cli
䜿çšãå«ãŸããŸãã ãããã£ãŠããã®ããŒã«ãç 究ããããšãéèŠã§ãã ç§ãã¡ã¯ãæè²ãããžã§ã¯ãã®äœæ¥äžãåžžã«ããã䜿çšããŸãã
äœæ¥ã®æåã®ã¹ãããã¯ã
ember-cli
ãã€ã³ã¹ããŒã«ããããšã§ãããã§ã«ã€ã³ã¹ããŒã«ãããŠããå Žåã¯ãæ¢åã®ããŒãžã§ã³ã®é¢é£æ§ã確èªããŸãã 次ã®ã³ãã³ãã䜿çšããŠã
npm
ã¬ãžã¹ããªãã
ember-cli
ãã€ã³ã¹ããŒã«ã§ããŸãã
$ npm install -g ember-cli
ã€ã³ã¹ããŒã«ãæåãããã©ããã確èªããåæã«ã€ã³ã¹ããŒã«ãããŠãã
ember-cli
ããŒãžã§ã³ã確èªããã«ã¯ã次ã®ã³ãã³ãã䜿çšã§ããŸãã
$ ember
Ember.jsã§ã®æåã®ã¢ããªã±ãŒã·ã§ã³ã®äœæ
ember-cli
ã€ã³ã¹ããŒã«åŸãã¢ããªã±ãŒã·ã§ã³ã®äœæãéå§ã§ããŸãã ããã¯ã
ember-cli
ã䜿çšããæåã®ç¶æ³ã§ãã 圌ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ§é ãäœæããæ§æããäœæ¥ãããžã§ã¯ããæäŸããŸãã 次ã®ã³ãã³ãã䜿çšããŠã
dice-roller
ã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã
$ ember new dice-roller installing app create .editorconfig create .ember-cli create .eslintrc.js create .travis.yml create .watchmanconfig create README.md create app/app.js create app/components/.gitkeep create app/controllers/.gitkeep create app/helpers/.gitkeep create app/index.html create app/models/.gitkeep create app/resolver.js create app/router.js create app/routes/.gitkeep create app/styles/app.css create app/templates/application.hbs create app/templates/components/.gitkeep create config/environment.js create config/targets.js create ember-cli-build.js create .gitignore create package.json create public/crossdomain.xml create public/robots.txt create testem.js create tests/.eslintrc.js create tests/helpers/destroy-app.js create tests/helpers/module-for-acceptance.js create tests/helpers/resolver.js create tests/helpers/start-app.js create tests/index.html create tests/integration/.gitkeep create tests/test-helper.js create tests/unit/.gitkeep create vendor/.gitkeep NPM: Installed dependencies Successfully initialized git. $
äžèšã®ã³ãã³ããå®è¡ãããšãå®è¡å¯èœãªã¢ããªã±ãŒã·ã§ã³ã¬ã€ã¢ãŠããäœæãããŸãã 圌女ã¯GitããŒãžã§ã³ç®¡çãèšå®ããŸããã Gitãšã®çµ±åããªãã«ããããšãã§ããããã«ã
npm
ããã±ãŒãžãããŒãžã£ãŒã®ä»£ããã«
yarn
ã䜿çšã§ããããšã«æ³šæããŠãã ããã 詳现ã«ã€ããŠã¯ãEmberã®ããã¥ã¡ã³ããã芧ãã ããã
ã§ã¯ãåŸããããã®ãèŠãŠã¿ãŸãããã ãã§ã«è¿°ã¹ãããã«ãéçºçšã®Emberã¢ããªã±ãŒã·ã§ã³ã®èµ·åã¯ã
ember-cli
ã䜿çšããŠå®è¡ãããŸãã ããã¯æ¬¡ã®ããã«è¡ãããŸãã
$ cd dice-roller $ ember serve Livereload server on http://localhost:49153 'instrument' is imported from external module 'ember-data/-debug' but never used Warning: ignoring input sourcemap for vendor/ember/ember.debug.js because ENOENT: no such file or directory, open '/Users/coxg/source/me/writing/repos/dice-roller/tmp/source_map_concat-input_base_path-2fXNPqjl.tmp/vendor/ember/ember.debug.map' Warning: ignoring input sourcemap for vendor/ember/ember-testing.js because ENOENT: no such file or directory, open '/Users/coxg/source/me/writing/repos/dice-roller/tmp/source_map_concat-input_base_path-Xwpjztar.tmp/vendor/ember/ember-testing.map' Build successful (5835ms) â Serving on http://localhost:4200/ Slowest Nodes (totalTime => 5% ) | Total (avg)
ããã§ãã¹ãŠã®æºåãæŽããŸãããã¢ããªã±ãŒã·ã§ã³ã¯
httpïŒ// localhostïŒ4200ã§å©çšã§ãã次ã®ããã«ãªããŸãã

ã¢ããªã±ãŒã·ã§ã³
èªäœã«å ããŠã
LiveReloadãµãŒãã¹ã
èµ·åãã ããããžã§ã¯ããã¡ã€ã«ãžã®å€æŽãç£èŠãããã©ãŠã¶ãŒã®ããŒãžãèªåçã«ãªããŒãããŸãã ããã¯ããµã€ãã®å€æŽäžã«ãå€æŽã®çµæãéåžžã«ãã°ãã衚瀺ãããããšãæå³ããŸãã
æåã®ããŒãžã§ã¯ã次ã«äœãã§ãããããããã®ã¡ãã»ãŒãžãèããŠãã¡ã€ã³ããŒãžãå€æŽããäœãèµ·ãããã確èªããŸãã ãããè¡ãã«ã¯ããã¡ã€ã«
app/templates/application.hbs
ã次ã®ãã©ãŒã ã«
app/templates/application.hbs
ããŸãã
This is my new application. {{outlet}}
{{outlet}}
ã¿ã°ã¯ãEmberã§ã®ã«ãŒãã£ã³ã°ããã»ã¹ã®ä»çµã¿ã®äžéšã§ããããšã«æ³šæããŠãã ããã ããã«ã€ããŠã¯ã以äžã§è©³ãã説æããŸãã
ãã¡ã€ã«ãå€æŽããåŸãããã«ã³ã³ãœãŒã«ã«è¡šç€ºããã
ember-cli
確èªããå¿
èŠããããŸãã 次ã®ããã«ãªããŸãã
file changed templates/application.hbs Build successful (67ms) â Serving on http://localhost:4200/ Slowest Nodes (totalTime => 5% ) | Total (avg) ----------------------------------------------+--------------------- SourceMapConcat: Concat: App (1) | 9ms SourceMapConcat: Concat: Vendor /asset... (1) | 8ms SimpleConcatConcat: Concat: Vendor Sty... (1) | 4ms Funnel (7) | 4ms (0 ms)
ããã§ãã·ã¹ãã ããã³ãã¬ãŒãã®å€æŽãæ€åºãããããžã§ã¯ããåæ§ç¯ããŠåèµ·åããããšãéç¥ãããŸãã ããã¯å®å
šã«èªååãããããã»ã¹ã§ãããåå ããŠããŸããã
次ã«ããã©ãŠã¶ãèŠãŠã¿ãŸãããã
LiveReload
ã€ã³ã¹ããŒã«ããŠå®è¡ããŠããå Žåãå€æŽã確èªããããã«ããŒãžãæåã§ãªããŒãããå¿
èŠã¯ãããŸããã ãã以å€ã®å Žåãã¢ããªã±ãŒã·ã§ã³ããŒãžã¯ããèªäœã§ãªããŒãããå¿
èŠããããŸãã

ããã¯ãããŒãžã®å€èŠ³ãé©ãã¹ããã®ã§ãããšèšãããšã§ã¯ãããŸããããããã䜿ã£ãŠè¡ã£ãããšã¯ãç§ãã¡ã®åŽã§æå°éã®åªåãå¿
èŠãšããŸããã
ããã«ãå®å
šã«ãã¹ãããããã¹ããµãã·ã¹ãã ããããŸãã ãããå®è¡ããã«ã¯ãé©åãªEmberããŒã«ã䜿çšããå¿
èŠããããŸãã
$ ember test â ž Building'instrument' is imported from external module 'ember-data/-debug' but never used â Ž BuildingWarning: ignoring input sourcemap for vendor/ember/ember.debug.js because ENOENT: no such file or directory, open '/Users/coxg/source/me/writing/repos/dice-roller/tmp/source_map_concat-input_base_path-S8aQFGaz.tmp/vendor/ember/ember.debug.map' â BuildingWarning: ignoring input sourcemap for vendor/ember/ember-testing.js because ENOENT: no such file or directory, open '/Users/coxg/source/me/writing/repos/dice-roller/tmp/source_map_concat-input_base_path-wO8OLEE2.tmp/vendor/ember/ember-testing.map' cleaning up... Built project successfully. Stored in "/Users/coxg/source/me/writing/repos/dice-roller/tmp/class-tests_dist-PUnMT5zL.tmp". ok 1 PhantomJS 2.1 - ESLint | app: app.js ok 2 PhantomJS 2.1 - ESLint | app: resolver.js ok 3 PhantomJS 2.1 - ESLint | app: router.js ok 4 PhantomJS 2.1 - ESLint | tests: helpers/destroy-app.js ok 5 PhantomJS 2.1 - ESLint | tests: helpers/module-for-acceptance.js ok 6 PhantomJS 2.1 - ESLint | tests: helpers/resolver.js ok 7 PhantomJS 2.1 - ESLint | tests: helpers/start-app.js ok 8 PhantomJS 2.1 - ESLint | tests: test-helper.js 1..8
åºåã®å€§éšåã¯
Phantom.jsããã®ãã®ã§ããããšã«æ³šæããŠãã ããã ããã¯ãçµ±åãã¹ããå®å
šã«ãµããŒããããŠããããã§ããããã©ã«ãã§ã¯ãã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ãªãã§PhantomJSãã©ãŠã¶ãŒã§å®è¡ãããŸãã å¿
èŠã«å¿ããŠãä»ã®ãã©ãŠã¶ãŒã§ãã¹ããå®è¡ããæ©èœããããŸãã ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã·ã¹ãã ïŒCIãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒãã»ããã¢ããããå Žåããã®æ©äŒãå©çšããŠããµããŒããããŠãããã¹ãŠã®ãã©ãŠã¶ãŒã§ã¢ããªã±ãŒã·ã§ã³ãæ£ããåäœããããšã確èªããå¿
èŠããããŸãã
Ember.jsã¢ããªã±ãŒã·ã§ã³ã®æ§é
ã¢ããªã±ãŒã·ã§ã³ã®äœæ¥ãéå§ããåã«ããã®åºã«ãªããã©ã«ããŒãšãã¡ã€ã«ã®æ§é ãç解ããŸãã äžèšã®
ember new
ã³ãã³ãã¯ãã¢ããªã±ãŒã·ã§ã³ã«å¿
èŠãªãã©ã«ããŒãšãã¡ã€ã«ãäœæããŸããããã®äžã«ã¯ããªãã®æ°ããããŸãã Emberã䜿çšããŠå¹æçãªäœæ¥ãç·šæããããããèŠæš¡ã®ãããžã§ã¯ããäœæããã«ã¯ããã¹ãŠãã©ã®ããã«æ©èœããããç解ããããšãéèŠã§ãã
ã¢ããªã±ãŒã·ã§ã³æ§é ã®æé«ã¬ãã«ã§ã¯ã次ã®ãã¡ã€ã«ãšãã©ã«ããŒã«æ³šæãæãããšãã§ããŸãã
- README.md-ã¢ããªã±ãŒã·ã§ã³ã®èª¬æãèšèŒãããæšæºã®readmeãã¡ã€ã«ã
- package.jsonã¯ãã¢ããªã±ãŒã·ã§ã³ãèšè¿°ãã
npm
æ§æãã¡ã€ã«ã§ãã äž»ã«ãäŸåé¢ä¿ãæ£ããã€ã³ã¹ããŒã«ãããããã«ããããã«äœ¿çšãããŸãã
- ember-cli-build.js-ã¢ããªã±ãŒã·ã§ã³ã®ãã«ããæ
åœãã
ember-cli
æ§æãã¡ã€ã«ã
- testem.js-ããã¯ããã¹ããµãã·ã¹ãã ã®æ§æãã¡ã€ã«ã§ãã ç¹ã«ãããŸããŸãªç°å¢ã§ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããæŽçããããã«äœ¿çšãããã©ãŠã¶ãŒãæå®ã§ããŸãã
- app /-ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã¯ããã«ä¿åãããŸãã ãã®ãã©ã«ãã§ã¯å€ãã®èå³æ·±ãããšãè¡ãããŠããŸãã以äžã§èª¬æããŸãã
- config /-ã¢ããªã±ãŒã·ã§ã³èšå®ã§ãã
- public /-ããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã«å«ããå¿
èŠã®ããéçãªãœãŒã¹ãæ ŒçŽãããŠããŸãã ããšãã°ããããã¯ç»åãšãã©ã³ãã§ãã
- ãã³ããŒ/-ããã«ã¯ããã«ãã·ã¹ãã ãå¶åŸ¡ããªãããã³ããšã³ãã®äŸåé¢ä¿ãå«ãŸããŸãã
- ãã¹ã/-ããã«ãã¹ãããããŸãã
ããŒãžæ§é
ç¶è¡ããåã«ãããŒãžã®æ§é ãèŠãŠã¿ãŸãããã ãã®å Žåã
Materialize CSSãã¬ãŒã ã¯ãŒã¯ã䜿çšããŸããããã«ãããããŒãžã®èŠæ ããè¯ããªãããšã³ããŠãŒã¶ãŒã«ãšã£ãŠãã䟿å©ã«äœæ¥ã§ããããã«ãªããŸãã
ã¢ããªã±ãŒã·ã§ã³ã«è¿œå ã®ããŒã«ã®ãµããŒããè¿œå ããã«ã¯ã次ã®ããããã®æ¹æ³ã䜿çšã§ããŸãã
- äœããã®CDNãªã©ã®å€éšãµãŒãã¹ã䜿çšããŠãå¿
èŠãªãã®ãçŽæ¥æ¥ç¶ããŸãã
npm
ãBower
ãªã©ã®ããã±ãŒãžãããŒãžã£ãŒã䜿çšããŠãå¿
èŠãªããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
- å¿
èŠãªãªãœãŒã¹ãã¢ããªã±ãŒã·ã§ã³ã«çŽæ¥å«ããŸãã
- Emberã«é©ããã¢ããªã³ã䜿çšããŠãã ããã
æ®å¿µãªããããããªã¢ã©ã€ãºã®ã¢ããªã³ã¯Ember.jsã®ææ°ããŒãžã§ã³ã§ã¯ãŸã åäœããªããããCDNãªãœãŒã¹ãžã®ãªã³ã¯ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ããŒãžã§ãã®ãã¬ãŒã ã¯ãŒã¯ãæ¥ç¶ããŸãã ãããè¡ãã«ã¯ã
app/index.html
ãã¡ã€ã«ãç·šéããå¿
èŠããããŸãããã®ãã¡ã€ã«ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã衚瀺ãããã¡ã€ã³ããŒãžã®æ§é ãèšè¿°ãããŠããŸãã CDNãªã³ã¯ãjQueryãGoogleã¢ã€ã³ã³ä»ããã©ã³ããããã³Materializeã«è¿œå ããŸãã
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.1/css/materialize.min.css"> <script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.1/js/materialize.min.js"></script>
ã¡ã€ã³ããŒãžãå€æŽããŠãã¢ããªã±ãŒã·ã§ã³ã®åºæ¬ãã³ãã¬ãŒãã衚瀺ã§ããããã«ãªããŸããã ããã¯ããã¡ã€ã«
app/templates/application.hbs
ã次ã®åœ¢åŒã«å€æããããšã«ããè¡ãããŸãã
<nav> <div class="nav-wrapper"> <a href="#" class="brand-logo"> <i class="material-icons">filter_6</i> Dice Roller </a> <ul id="nav-mobile" class="right hide-on-med-and-down"> </ul> </div> </nav> <div class="container"> {{outlet}} </div>
ãã®ã³ãŒãã®ãããã§ããããªã¢ã©ã€ãºããŒã«ã«ãã£ãŠæºåãããããã²ãŒã·ã§ã³ããŒãããŒãžã®äžéšã«è¡šç€ºãããŸãã äžèšã®
{{outlet}}
ã¿ã°ãé
眮ãããŠããããŒãžã«ãã³ã³ãããŒããããŸãã
ããã§ããã©ãŠã¶ãèŠããšãããŒãžãäžã®å³ã«ç€ºãããã«ãªã£ãŠããããšãããããŸãã

{{outlet}}
ã¿ã°ã«ã€ããŠèª¬æããŸãã Emberã®äœæ¥ã¯ã«ãŒãããŒã¹ã§ãã åã«ãŒãã¯ãä»ã®ã«ãŒãã®åå«ãšèŠãªãããŸãã ã«ãŒãã«ãŒãã¯èªåçã«åŠçããããã³ãã¬ãŒã
app/templates/application.hbs
衚瀺ãã
app/templates/application.hbs
ã
{{outlet}}
ã¿ã°ã¯ãEmberãçŸåšã®éå±€ã®æ¬¡ã®ã«ãŒãã«å¯Ÿå¿ããã³ã³ãã³ãã衚瀺ããå Žæãèšå®ããŸãããã®çµæã第1ã¬ãã«ã®ã«ãŒãã¯
application.hbs
ãã®ã¿ã°ã«è¡šç€ºããã第2ã¬ãã«ã®ã«ãŒãã¯ç¬¬1ã¬ãã«ãã³ãã¬ãŒãã®åãã¿ã°ã«è¡šç€ºãããããã«ã
æ°ããã«ãŒããäœæãã
Ember.jsäžã®ã¢ããªã±ãŒã·ã§ã³ã®åããŒãžãžã®ã¢ã¯ã»ã¹ã¯ãã«ãŒãïŒã«ãŒãïŒã§æŽçãããŠããŸãã ãã©ãŠã¶ãéãURLãšãã¢ããªã±ãŒã·ã§ã³ã衚瀺ããã«ãŒãã«é¢é£ããè³æãšã®éã«ã¯çŽæ¥çãªå¯Ÿå¿ããããŸãã
ãã®æŠå¿µãç解ããæãç°¡åãªæ¹æ³ã¯ãäŸã䜿çšããããšã§ãã ãŠãŒã¶ãŒããµã€ã³ããã転ãããããšãèš±å¯ããæ°ããã«ãŒããã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããŸãã ãã®ã¹ããããã
ember-cli
ã䜿çšããŠå®è¡ãããŸãã
$ ember generate route roll installing route create app/routes/roll.js create app/templates/roll.hbs updating router add route roll installing route-test create tests/unit/routes/roll-test.js
ãã®ã³ãã³ããåŒã³åºããŠäœæããããã®ã¯æ¬¡ã®ãšããã§ãã
- ã«ãŒãã®ãã³ãã©ãŒã¯
app/routes/roll.js
- ã«ãŒãã®ãã³ãã¬ãŒãã¯
app/templates/roll.hbs
ã§ãã
- ã«ãŒãã®
tests/unit/routes/roll-test.js
- ã«ãŒã¿ãŒèšå®ãæŽæ°ããŠããã®æ°ããã«ãŒãã«é¢ããæ
å ±ãæäŸããŸã
app/router.js
ä»çµã¿ãèŠãŠã¿ãŸãããã ãããŸã§ã®ãšããããµã€ã³ããšãã¿ã³ã説æããèŠçŽ ãå«ãéåžžã«ã·ã³ãã«ãªããŒãžããããå°ãåŸã«ãæãããããšãã§ããŸãã ãã®ããŒãžãäœæããã«ã¯ããã³ãã¬ãŒããã¡ã€ã«
app/templates/roll.hbs
次ã®ã³ãŒããæ¿å
¥ããŸãã
<div class="row"> <form class="col s12"> <div class="row"> <div class="input-field col s12"> <input placeholder="Name" id="roll_name" type="text" class="validate"> <label for="roll_name">Name of Roll</label> </div> </div> <div class="row"> <div class="input-field col s6"> <input placeholder="Number of dice" id="number_of_dice" type="number" class="validate" value="1"> <label for="number_of_dice">Number of Dice</label> </div> <div class="input-field col s6"> <input placeholder="Number of sides" id="number_of_sides" type="number" class="validate" value="6"> <label for="number_of_sides">Number of Sides</label> </div> </div> <div class="row"> <button class="btn waves-effect waves-light" type="submit" name="action"> Roll Dice <i class="material-icons right">send</i> </button> </div> </form> </div> {{outlet}}
ãã®åŸã
httpïŒ// localhostïŒ4200 / rollããŒãžã«ã¢ã¯ã»ã¹ããŠãäœãèµ·ãããã確èªããŸãã

ããã§ãã¢ããªã±ãŒã·ã§ã³ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠãã®ããŒãžãžã®ç§»è¡ãæŽçããæ¹æ³ãå¿
èŠã§ãã Emberã¯ã
link-to
ã¿ã°ã䜿çšããŠãã®ã¿ã¹ã¯ãç°¡çŽ åããŸãã ç¹ã«ããŠãŒã¶ãŒã«éä¿¡ããã«ãŒãã®ååãåãå
¥ãããŠãŒã¶ãŒããã®ã«ãŒãããã©ãããšãã§ããèŠçŽ ã衚瀺ããŸãã
app/templates/application.hbs
ãã¡ã€ã«ã«æ¬¡ãå«ããŸãã
<ul id="nav-mobile" class="right hide-on-med-and-down"> {{#link-to 'roll' tagName="li"}} <a href="roll">Roll Dice</a> {{/link-to}} </ul>
ããã«ãããããŒãžäžéšã®ããã²ãŒã·ã§ã³ããŒã次ã®å³ã«ç€ºã圢åŒã«ãªããŸãã

æ°ãããªã³ã¯
Roll Dice
ãããã«ã®å³åŽã«è¡šç€ºãããã¯ãªãã¯ãããšããŠãŒã¶ãŒã¯
/roll
ã«ãŒãããã©ããŸãã ãããç§ãã¡ãéæããããšããããšã§ãã
ã¢ãžã¥ã©ãŒã³ã³ããŒãã³ãéçº
ã¢ããªã±ãŒã·ã§ã³ã§äœæ¥ããããšãããšãè©ŠããŠã¿ãŠãã ãããåé¡ã«æ°ã¥ãã§ãããã ããŒã ããŒãžã¯æ£åžžã«éãã
/roll
ãªã³ã¯ã¯æ©èœããŸããããã©ãŒã ã®ãã£ãŒã«ãã©ãã«ãæ£ããé
眮ãããŠããŸããã ããã¯ãMaterializeãèŠçŽ ãé©åã«é
眮ããããã«ç¹å®ã®JSã³ãŒããåŒã³åºãå¿
èŠãããããã§ãããåçã«ãŒãã£ã³ã°ã®æ©èœã«ãããããŒãžã¯ãªããŒããããŸããã ä»ãããä¿®æ£ããŸãã
ã³ã³ããŒãã³ããæäœããŸãããã ã³ã³ããŒãã³ãã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®ãã©ã°ã¡ã³ãã§ãããçžäºäœçšã§ããå®å
šãªã©ã€ããµã€ã¯ã«ãæã£ãŠããŸãã ããã«ãã³ã³ããŒãã³ãã䜿çšãããšãå¿
èŠã«å¿ããŠãåå©çšã«é©ãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ãäœæã§ããŸãã ããã«ã€ããŠã¯åŸã§èª¬æããŸãã
次ã«ã
Roll Dice
ãã©ãŒã ã§ããå¯äžã®ã³ã³ããŒãã³ããäœæããŸãã ãã®ãããªç¶æ³ã§ã¯ãã€ãã®ããã«ãã³ã³ããŒãã³ããäœæããããã«ã
ember-cli
ãèŠãŠã¿ãŸãããã
$ ember generate component roll-dice installing component create app/components/roll-dice.js create app/templates/components/roll-dice.hbs installing component-test create tests/integration/components/roll-dice-test.js
ãã®çµæãã·ã¹ãã ã¯ä»¥äžãäœæããŸãã
- ã³ã³ããŒãã³ãããžãã¯ãå®è£
ããã³ãŒã
app/components/roll-dice.js
- >ã³ã³ããŒãã³ãã®å€èŠ³ã決å®ãããã³ãã¬ãŒã
app/templates/components/roll-dice.hbs
- ã³ã³ããŒãã³ãã®æ£ããåäœããã§ãã¯ããããã®
tests/integration/components/roll-dice-test.js
次ã«ããã¹ãŠã®ããŒã¯ã¢ãããã³ã³ããŒãã³ãã«ç§»åããŸãã ããã¯ãã¢ããªã±ãŒã·ã§ã³ã®åäœã«çŽæ¥åœ±é¿ãäžããããšã¯ãããŸããããå°æ¥ãå¿
èŠãªæ¹æ³ã§æ§æããã®ã«åœ¹ç«ã¡ãŸãã
ãã¡ã€ã«
app/templates/components/roll-dice.hbs
ããã®ç¶æ
ã«ããŸãïŒ
<form class="col s12"> <div class="row"> <div class="input-field col s12"> <input placeholder="Name" id="roll_name" type="text" class="validate"> <label for="roll_name">Name of Roll</label> </div> </div> <div class="row"> <div class="input-field col s6"> <input placeholder="Number of dice" id="number_of_dice" type="number" class="validate" value="1"> <label for="number_of_dice">Number of Dice</label> </div> <div class="input-field col s6"> <input placeholder="Number of sides" id="number_of_sides" type="number" class="validate" value="6"> <label for="number_of_sides">Number of Sides</label> </div> </div> <div class="row"> <button class="btn waves-effect waves-light" type="submit" name="action"> Roll Dice <i class="material-icons right">send</i> </button> </div> </form>
app/templates/roll.hbs
次ã®ã³ãŒãã
app/templates/roll.hbs
ïŒ
<div class="row"> {{roll-dice}} </div> {{outlet}}
以åã«ã«ãŒããã³ãã¬ãŒããã¡ã€ã«ã«é
眮ãããŠããåãããŒã¯ã¢ããããã³ã³ããŒãã³ããã³ãã¬ãŒãã«åé¡ãããŸããã ã«ãŒããã³ãã¬ãŒããã¡ã€ã«ãã¯ããã«åçŽã«ãªããŸããã
roll-dice
ã¿ã°ã¯ãEmberã«ã³ã³ããŒãã³ããé
眮ããå ŽæãäŒããŸãã
ãã©ãŠã¶ã§ã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«èŠããããä»èŠãŠããéãã¯èŠãããŸããã ãã ããã³ãŒãããã€ã¹ã¯å€æŽãããã¢ãžã¥ãŒã«åãããŠããŸãã ééã£ãããŒãžã¬ã€ã¢ãŠããä¿®æ£ããã¢ããªã±ãŒã·ã§ã³ã«ããã€ãã®æ°æ©èœãè¿œå ããããã«ãäœæããã³ã³ããŒãã³ãã䜿çšããŸãã
ã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«
Emberã®ã³ã³ããŒãã³ãã«ã¯ç¹å¥ãªã©ã€ããµã€ã¯ã«ããããã©ã€ããµã€ã¯ã«ã®ããŸããŸãªæ®µéã§ããã¯ãåŒã³åºãããŸãã ãããªã¢ã©ã€ãºã眲åãæ£ãã衚瀺ã§ããããã«ããã«ã¯ãã³ã³ããŒãã³ãã衚瀺ãããåŸã«åŒã³åºããã
didRender
ããã¯ã䜿çšããŸãã ããã«ãããã¯ã³ã³ããŒãã³ãã®æåã®ã·ã§ãŒãšãã®åŸã®ãã£ã¹ãã¬ã€ã®äž¡æ¹ã§è¡ãããŸãã
ãããè¡ãã«ã¯ããã¡ã€ã«
app/components/roll-dice.js
ããã³ã³ããŒãã³ãã³ãŒããç·šéããŸãã
import Ember from 'ember'; export default Ember.Component.extend({ didRender() { Materialize.updateTextFields(); } });
ããã§ããã€ã¬ã¯ããªã³ã¯ãŸãã¯ããã²ãŒã·ã§ã³ããã«ããã®ãªã³ã¯ã䜿çšããŠ
/roll
ã«ãŒãã«ã¢ã¯ã»ã¹ãããã³ã«ããã®ã³ãŒããå®è¡ããããããªã¢ã©ã€ãºã¯ããã¹ããã£ãŒã«ãã®çœ²åãæ£ãã衚瀺ããŸãã
ããŒã¿ãã€ã³ãã£ã³ã°
ã³ã³ããŒãã³ãã䜿çšããŠãããŒã¿ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ããŒãããããããã¢ã³ããŒãããŸãã ããã¯éåžžã«ç°¡åã§ãããèå³æ·±ãããšã«ãEmberããã¥ã¢ã«ã«ã¯ããã«ã€ããŠäœããããŸããã ãã®çµæãEmberã®ããŒã¿ãã€ã³ãã£ã³ã°æé ã¯å®éãããè€éã«èŠããŸãã
åŠçããããŒã¿ã®åéšåã¯ã
Component
ã¯ã©ã¹ã®ãã£ãŒã«ãã®åœ¢åŒã§ååšããŸãã ãããç¥ã£ãŠãã³ã³ããŒãã³ãã®å
¥åãã£ãŒã«ãã衚瀺ãããããã®ãã£ãŒã«ããã³ã³ããŒãã³ãå€æ°ã«ãã€ã³ãã§ããè£å©ããŒã«ã䜿çšã§ããŸãã ãã®çµæãDOMã䜿çšããããšãèããã«ãããŒã¿ãçŽæ¥æäœã§ããŸãã
ãã®å Žåã3ã€ã®ãã£ãŒã«ãããããããã³ã³ããŒãã³ãå®çŸ©ãããã¯å
ã®
app/components/roll-dice.js
ã«3è¡ã®ã³ãŒããè¿œå ããå¿
èŠããããŸãã
rollName: '', numberOfDice: 1, numberOfSides: 6,
次ã«ãéåžžã®HTMLããŒã¯ã¢ããã®ä»£ããã«è£å©ã¡ã«ããºã ã䜿çšããŠãã®ããŒã¿ãåºåããããã«ãã³ãã¬ãŒããæ§æããŸãã ãããè¡ãã«ã¯ã
<input>
ã次ã®ã³ãŒãã«çœ®ãæããå¿
èŠããããŸãã
<div class="row"> <div class="input-field col s12"> {{input placeholder="Name" id="roll_name" class="validate" value=(mut rollName)}} <label for="roll_name">Name of Roll</label> </div> </div> <div class="row"> <div class="input-field col s6"> {{input placeholder="Number of dice" id="number_of_dice" type="number" class="validate" value=(mut numberOfDice)}} <label for="number_of_dice">Number of Dice</label> </div> <div class="input-field col s6"> {{input placeholder="Number of sides" id="number_of_sides" type="number" class="validate" value=(mut numberOfSides)}} <label for="number_of_sides">Number of Sides</label> </div> </div>
value
å±æ§ã®æ§æã¯ç°åžžã«èŠããããšã«æ³šæããŠãã ããã åæ§ã®æ§æã¯ã
value
ã ãã§ãªããä»»æã®ã¿ã°å±æ§ã«äœ¿çšã§ã
value
ã ãããã䜿çšãã3ã€ã®æ¹æ³ã次ã«ç€ºããŸãã
- åŒçšç¬Šã§å²ãŸããæååãšããŠã ãã®ã¢ãããŒãã§ã¯ãå€ã¯ã³ãŒãã§è¡šç€ºããã圢åŒã§è¡šç€ºãããŸãã
- åŒçšç¬Šãªãã®æååãšããŠã ãã®å Žåãå€ã¯ã³ã³ããŒãã³ãã®å¯Ÿå¿ããããŒã¿ããååŸãããŸãããããŒã¿ãåºåããèŠçŽ ã¯ã³ã³ããŒãã³ãã«åœ±é¿ããŸããã
- ã³ã³ã¹ãã©ã¯ã·ã§ã³ã®åœ¢åŒ
(mut <name>)
ã ãã®ããã察å¿ããå€ã¯ã³ã³ããŒãã³ãããååŸããããã©ãŠã¶ã§å€ãå€æŽããããšã³ã³ããŒãã³ããå€æŽïŒå€æŽïŒãããŸãã
, , , Ember.
. ,
Roll Dice
. Ember (Actions). â , . â , , , ,
actions
.
, , ( ).
OnSubmit
. , ,
Enter
.
, ,
app/components/roll-dice.hbs
:
actions: { triggerRoll() { alert(`Rolling ${this.numberOfDice}D${this.numberOfSides} as "${this.rollName}"`); return false; } }
false
. â , HTML-. .
, , . DOM â , â JS-.
. ,
onsubmit
. Ember .
app/templates/components/roll-dice.hbs
:
<form class="col s12" onsubmit={{action 'triggerRoll'}}>
, , , , .

, - «» . . «» . :
- , «».
- Roll Dice.
- , , .
- «» , .
- «».
, , Ember .
Ember (Store), (Models). â , (Model) , . , , .
. ( , ), . .
, , â . , , , , , . , DOM Ember , - .
, , , , . , , .
, , ,
app/routes/roll.js
, , , .
actions: { saveRoll: function(rollName, numberOfDice, numberOfSides) { alert(`Rolling ${numberOfDice}D${numberOfSides} as "${rollName}"`); } }
,
app/components/roll-dice.js
, .
sendAction
:
triggerRoll() { this.sendAction('roll', this.rollName, this.numberOfDice, this.numberOfSides); return false; }
, , , . â
app/templates/roll.hbs
. , :
{{roll-dice roll="saveRoll" }}
,
roll
saveRoll
. ,
roll
, , , «» . , , «» , , .
, , , , , , .
, , .
ember-cli
.
, , :
$ ember generate model roll installing model create app/models/roll.js installing model-test create tests/unit/models/roll-test.js
, .
app/models/roll.js
:
import DS from 'ember-data'; export default DS.Model.extend({ rollName: DS.attr('string'), numberOfDice: DS.attr('number'), numberOfSides: DS.attr('number'), result: DS.attr('number') });
DS.attr
. â
string
,
number
,
date
boolean
, , .
, «» . ,
app/routes/roll.js
:
saveRoll: function(rollName, numberOfDice, numberOfSides) { let result = 0; for (let i = 0; i < numberOfDice; ++i) { result += 1 + (parseInt(Math.random() * numberOfSides)); } const store = this.get('store');
, ,
Roll Dice
. , , , , , â .

Ember.js, . Ember.js , , ,
ember-localstorage-adapter , . . , .
, - , . ,
index
â .
Ember ,
index
, . , , , . «» .
index
,
ember-cli
. .
app/routes/index.js
, :
import Ember from 'ember'; export default Ember.Route.extend({ model() { return this.get('store').findAll('roll'); } });
findAll
«» . ,
model
.
index
app/templates/index.hbs
:
<table> <thead> <tr> <th>Name</th> <th>Dice Rolled</th> <th>Result</th> </tr> </thead> <tbody> {{#each model as |roll|}} <tr> <td>{{roll.rollName}}</td> <td>{{roll.numberOfDice}}D{{roll.numberOfSides}}</td> <td>{{roll.result}}</td> </tr> {{/each}} </tbody> </table> {{outlet}}
, . «»:

ãŸãšã
, , , , «» . , , , . .
Ember . , , React, Ember , - .
ember-cli
â , .
, , Ember , .
Ember . , Ember . , , « », Ember . Ember, , , ( ) , , .
Ember â , -. , , , , , .
芪æãªãèªè
ïŒ Ember.js?