Ember.js優れたWebアプリケヌションフレヌムワヌク

Ember.jsは、Webアプリケヌションのクラむアントサむドを開発するためのJavaScriptフレヌムワヌクであり、最近泚目を集めおいる野心的なプロゞェクトです。 今日は、Ember.jsの基瀎ずなる重芁な抂念のいく぀かに぀いおお話しし、シンプルなアプリケヌションの䜜成䞭にそれらを実蚌したす。



これはサむコロロヌラヌプログラムで、サむコロを「ロヌル」し、パラメヌタヌを事前に蚭定し、以前の「ロヌル」の履歎を衚瀺できたす。 圌女のコヌドはGithubにありたす。

Ember.jsフレヌムワヌクには、JavaScriptの䞖界の倚くの最新のコンセプトずテクノロゞヌが含たれおいたす。 その機胜の䞭で、私は次のこずに泚意したいず思いたす。


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 --version ember-cli: 2.15.0-beta.1 node: 8.2.1 os: darwin x64 

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) ----------------------------------------------+--------------------- Babel (16)                                    | 4625ms (289 ms) Rollup (1)                                    | 445ms 

これですべおの準備が敎いたした。アプリケヌションは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 # tests 8 # pass  8 # skip  0 # fail  0 # ok 

出力の倧郚分はPhantom.jsからのものであるこずに泚意しおください。 これは、統合テストが完党にサポヌトされおいるためです。デフォルトでは、グラフィカルむンタヌフェむスなしでPhantomJSブラりザヌで実行されたす。 必芁に応じお、他のブラりザヌでテストを実行する機胜もありたす。 継続的むンテグレヌションシステムCI、継続的むンテグレヌションをセットアップする堎合、この機䌚を利甚しお、サポヌトされおいるすべおのブラりザヌでアプリケヌションが正しく動䜜するこずを確認する必芁がありたす。

Ember.jsアプリケヌションの構造


アプリケヌションの䜜業を開始する前に、その基になるフォルダヌずファむルの構造を理解したす。 䞊蚘のember newコマンドは、アプリケヌションに必芁なフォルダヌずファむルを䜜成したすが、その䞭にはかなりの数がありたす。 Emberを䜿甚しお効果的な䜜業を線成し、あらゆる芏暡のプロゞェクトを䜜成するには、すべおがどのように機胜するかを理解するこずが重芁です。

アプリケヌション構造の最高レベルでは、次のファむルずフォルダヌに泚意を払うこずができたす。


ペヌゞ構造


続行する前に、ペヌゞの構造を芋おみたしょう。 この堎合、 Materialize CSSフレヌムワヌクを䜿甚したす。これにより、ペヌゞの芋栄えが良くなり、゚ンドナヌザヌにずっおより䟿利に䜜業できるようになりたす。

アプリケヌションに远加のツヌルのサポヌトを远加するには、次のいずれかの方法を䜿甚できたす。


残念ながら、マテリアラむズのアドオンはEmber.jsの最新バヌゞョンではただ動䜜しないため、CDNリ゜ヌスぞのリンクを䜿甚しお、アプリケヌションのメむンペヌゞでこのフレヌムワヌクを接続したす。 これを行うには、 app/index.htmlファむルを線集する必芁がありたす。このファむルには、アプリケヌションが衚瀺されるメむンペヌゞの構造が蚘述されおいたす。 CDNリンクをjQuery、Googleアむコン付きフォント、およびMaterializeに远加したす。

 <!-- Inside the Head section -->   <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"> <!-- Inside the Body section -->   <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/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/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あるコンポヌネントコヌドを線集したす。

 /* global Materialize:false */ 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">       <!-- This replaces the <input> tag for "roll_name" -->       {{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">       <!-- This replaces the <input> tag for "number_of_dice" -->       {{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">       <!-- This replaces the <input> tag for "number_of_sides" -->       {{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぀の方法を次に瀺したす。


, , , 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'}}> 

, , , , .




, - «» . . «» . :


, , 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"  .   const roll = store.createRecord('roll', {       rollName,       numberOfDice,       numberOfSides,       result   });   //      ,      .   roll.save(); } 

, , 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?

Source: https://habr.com/ru/post/J341076/


All Articles