ホームページ  >  記事  >  ウェブフロントエンド  >  Emberjs を探索して簡単な Todo アプリケーションを作成する_JavaScript のヒント

Emberjs を探索して簡単な Todo アプリケーションを作成する_JavaScript のヒント

WBOY
WBOYオリジナル
2016-05-16 17:48:431104ブラウズ
目標
Emberjs を使用して簡単な Todo アプリケーションを作成し、次の効果を実現します。 テキスト ボックスにテキストを入力して ToDo 項目を作成します。To Do 項目に優先順位を付けたり、完了した項目を作成したりできます。削除される。

準備
このアプリケーションを完了するには、いくつかの準備をする必要があります。
1. 現時点ではスタイルに関係なく、HTML ページを作成します。スクリプト: emberjs、ハンドルバー、jQuery。これら 3 つのスクリプトはオンラインで入手できるので、head タグに追加します。


制作 ページを作成し、スクリプトを追加して、アプリケーションの作成を開始します。 HTML コードは次のとおりです:


コードをコピー コードは次のとおりです:


最初のアプリケーション/title> <br><script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></スクリプト> <br><script type="text/javascript" src="http://cloud.github.com/downloads/wycats/handlebars.js/handlebars-1.0.rc.1.js"> /script> <br><script type="text/javascript" src="http://cloud.github.com/downloads/emberjs/ember.js/ember-1.0.0-pre.2.min.js "></script> <br></head> <br><body> <br></body> <br></html> <br><br> <br><br> ember の要件に従い、最初に Ember.Application.create() を使用してアプリケーション インスタンスを作成する必要があります。これはアプリケーションの名前空間としても機能します。この作成メソッドはオブジェクト属性を渡すことができ、その属性値はアプリケーションの準備ができたときに呼び出される関数です。 Ember は、略語 Em に置き換えることもできます。 </div> <br>Ember には、window.console に相当する Em.Logger オブジェクトがあり、デバッグに使用できます。これにメッセージを追加して、コンソールに表示できます。 <br><br>次に、head タグ内に別の script タグを追加してアプリケーション スクリプトを記述し、ember アプリケーションをインスタンス化し、各 MVC モジュールの領域を追加します。スクリプト コードは次のとおりです: <br><br><br><br><br><div class="codetitle">コードをコピー <span><a style="CURSOR: pointer" data="2704" class="copybut" id="copybut2704" onclick="doCopy('code2704')"><u> コードは次のとおりです: </u></a> </span>/******************** </div>アプリケーション<div class="codebody" id="code2704">********************/ <br><br>window.App = Ember.Application.create( <br>{ <br>ready:function(){ <br>Em.Logger.info('へようこそToDo アプリ') ; <br>} <br>} <br>); <br><br>/******************** <br>モデル <br>********************/ <br><br><br><br>/** ****************** <br><br>を見る********************/ <br><br><br>/******************** <br>コントロール <br>*****************/ <br><br> <br><br>次に、ToDo 項目を入力するための入力ボックスが必要です。 Ember テキスト ボックス ビューを作成する必要があります。 Ember ビューは、Ember.View クラスを使用して新しいビュー クラスで作成 (create メソッドを使用) または拡張 (extend メソッドを使用) できます。ただし、テキスト ボックス ビューの場合、ember はより直接的な方法、つまり Ember.TextField クラスを提供します。まずこのクラスを使用してカスタム ビューを拡張し、次にそれをインスタンス化してページに追加します。このテキスト ボックス ビュー クラスに AddItemView という名前を付けます。 </div> <br>スクリプト コードの表示領域にテキスト ボックス ビュー コードを追加します: <br><br><br><br><br><div class="codetitle">コードをコピー<span><a style="CURSOR: pointer" data="80678" class="copybut" id="copybut80678" onclick="doCopy('code80678')"><u>コードは次のとおりです: </u></a> </span>App.AddItemView = Ember.TextField.extend({ </div> <div class="codebody" id="code80678">}); <br><br> <br><br>プロンプトを追加できます。それには、html5 がプレースホルダーをサポートしており、使用できます。 Enter キーを押すと、代表的な項目のリストにコンテンツを追加する必要があります。ここでは、insertNewline 属性を使用する必要があります。Enter キーを押すと、対応する関数が呼び出されます。追加後のコードは次のとおりです。 </div> <br><br><br><br><div class="codetitle">コードをコピーします <span><a style="CURSOR: pointer" data="20199" class="copybut" id="copybut20199" onclick="doCopy('code20199')"><u> コードは次のとおりです: </u></a> </span>App.AddItemView = Ember.TextField.extend({ </div>placeholder:'To-Do を入力', <div class="codebody" id="code20199">insertNewline:function(){} <br>});<br><br>具体的な追加方法がまだ決まっていないため、関数本体はまだ書きません。 <br><br>ユーザーは Enter キーを押すと ToDo 項目を追加します。これにはリストを表示する必要があります。CollectionView には、デフォルトでリスト項目ビューを保存するために作成できます。プロパティ値が配列であるリスト項目を格納します。リストをulリストとして表示するには、CollectionViewのタグ名(tagName)を「ul」と定義する必要があります。このリスト ビューに ListView という名前を付け、テキスト ボックス ビューの下に追加します。最終的なコードは次のとおりです: <br><br><div class="codetitle"> <span><a style="CURSOR: pointer" data="1636" class="copybut" id="copybut1636" onclick="doCopy('code1636')"><u> コードをコピーします </u></a></span> コードは次のとおりです: </div> <div class="codebody" id="code1636"> <br>App.ListView = Ember .CollectionView.extend({ <br>content:[], <br>tagName:'ul' <br>}); <br> </div> <br><br>今開いたらページ、コンテンツは表示されません。 はい、ビューがレンダリングされていないため、ビューを表示するには、ハンドルバー テンプレートのサポートが必要です。 <br><br>次に、HTML ページの本文ブロックを変更し、作成した 2 つのビューを追加して効果を確認しましょう。 <br><br>ハンドルバー テンプレートを追加する方法は、<script type="text/x-handlebars">/*View Assistant*/</script> です。data- でテンプレート名を指定することもできます。 template-name 属性で定義されます。後でリスト項目を追加するときに必要になります。 <br><br>テンプレートでは、ビュー ヘルパー (ヘルパー) を使用してビューを追加する必要があります。構文も非常に単純です。2 つの中かっこを使用してビューを指定します。 {{view App.AddItemView}} のように表示されます。他のテンプレート ヘルパーは、ハンドルバー Web サイト http://handlebarsjs.com/ で見つけることができます。 <br><br>ここでテキスト ボックスとリスト ビューをページに追加します。変更された本体コードは次のとおりです。<br><br><div class="codetitle"> <span><a style="CURSOR: pointer" data="83882" class="copybut" id="copybut83882" onclick="doCopy('code83882')"><u>コードをコピーします</u></a></span> コードは次のとおりです: </div> <div class="codebody" id="code83882"> <br><body> <br><script type="text/x-handlebars"> を入力してください。 To-Do アイテム :</span>{{view App.AddItemView}}<br/> <br><br>{{view App.ListView}} <br></script> ;/body> <br><br> <br> </div> ここでページを更新すると、「To Do 項目を入力してください」という文とテキスト ボックスが表示されます。リストはありません。コンテンツ。 <br><br>現時点では、content:['a','b','c'] などのコンテンツを追加して、ページを更新すると、コンテンツが 3 つだけであることがわかります。リスト領域に小さな黒い点が表示されます (リストのスタイルをリセットしていない場合)。コンテンツに 3 つの項目を追加しましたが、リスト項目には表示テンプレートが指定されていないため、表示は空です。効果を確認するために、リスト項目の表示テンプレートを定義しましょう。ここで扱うべきことは 2 つあります。1 つ目は、指定した名前のテンプレートをページに追加することです。2 つ目は、リスト ビュー内のリスト項目の属性を定義することです。 <br><br>リスト項目を定義するには、itemViewClass を使用する必要があります。これにより、各コンテンツ項目が渡され、指定されたテンプレートを使用して表示されます。まずリストビュー ListView を変更し、 itemViewClass 属性を追加します。これもビューなので、作成時に表示に使用するテンプレートの名前を itemTemplate として指定します。 HTML のハンドルバーのテンプレート名に表示するためにも使用されます。変更されたコードは次のとおりです: <br><br><br><br><div class="codetitle"> <span> コードをコピーします <a style="CURSOR: pointer" data="10586" class="copybut" id="copybut10586" onclick="doCopy('code10586')"><u></u> コードは次のとおりです: </a></span> </div>App.ListView = Ember.CollectionView.extend({ <div class="codebody" id="code10586">content:['a','b','c'], <br>tagName:'ul', <br>itemViewClass: Ember.View. extend({ <br>templateName:'itemTemplate', <br>}) <br>}); <br><br> <br> </div>あとは HTML を変更するだけです。ボディハンドルバーテンプレートに新しいものを作成する必要があり、上で指定したテンプレート名を使用します。コードは次のとおりです: <br><br><br><br><div class="codetitle"> <span>コードをコピー<a style="CURSOR: pointer" data="30476" class="copybut" id="copybut30476" onclick="doCopy('code30476')"><u></u> コードは次のとおりです。</a></span> </div><script type="text/x-handlebars" data-template-name="itemTemplate"> <div class="codebody" id="code30476"> <br></script> <br><br> <br> </div>次に、各コンテンツ項目をアシスタントに渡すために、view.content が使用されます。次のコードを追加します: <br><br><br><br><div class="codetitle"> <span> コード <a style="CURSOR: pointer" data="97363" class="copybut" id="copybut97363" onclick="doCopy('code97363')"><u></u> をコピーします。 コードは次のとおりです: </a></span> </div> <script type= "text/x-handlebars" data-template-name="itemTemplate"> <div class="codebody" id="code97363">{{view.content}} <br><br><br><br><br>完了後、ページを更新すると、ようやくコンテンツ内の内容が表示され、テンプレートに li タグが自動的に追加されます。 <br><br>アプリの改善を続けます。内容を固定して書くことはできないので、ユーザーはどうやって追加できるのでしょうか?そこで、ユーザーが追加したい項目を配列に保存し、コンテンツ自体がこの配列の内容を取得することを考えてみましょう。同時に、ember フレームワークは双方向バインディングをサポートしています。配列のコンテンツが変更されると、バインドされたコンテンツも同時に変更され、その逆も同様です。ここで、ember 配列を作成し、コンテンツにバインドします。 <br><br>ember 配列は ArrayController クラスを通じて作成できます。これにより、渡した通常の JavaScript が新しい ember 配列オブジェクトに変換され、プロジェクトの管理に使用される配列に todoStore という名前が付けられ、HTML ページに配置されます。コントローラー領域で、作成されたコードは次のとおりです。 <br><br><div class="codetitle"> <span><a style="CURSOR: pointer" data="96700" class="copybut" id="copybut96700" onclick="doCopy('code96700')"><u>コードをコピー </u></a></span> コードは次のとおりです。 </div> <div class="codebody" id="code96700"> <br>App .todoStore = Ember.ArrayController.create({ <br>content:[] <br>}); <br> </div> <br><br>これで、コンテンツ配列を配置できます。 ListView を todoStore 配列に追加し、ListView のコンテンツを todoStore にバインドします。<br><br><div class="codetitle"> <span><a style="CURSOR: pointer" data="72133" class="copybut" id="copybut72133" onclick="doCopy('code72133')"><u>Copy code</u></a></span> コードは次のとおりです: </div> <div class="codebody" id="code72133"> <br>App.ListView = Ember.CollectionView.extend({ <br>contentBinding:'App.todoStore', <br>tagName:' ul', <br>itemViewClass: Ember.View.extend({ <br>templateName:'itemTemplate' <br>}) <br>}); >App.todoStore = Ember.ArrayController .create({ <br>content:['a','b','c'] <br>}); <br><br> <br><br>バインディングはバインディングを示すサフィックス、属性値 これはバインドされたオブジェクトであり、オブジェクトの content 属性がデフォルトで取得されます。変更が完了したら、ページを更新してください。表示されているページが変更前と同じであれば、変更は成功しています。次に、コンテンツ内の値を削除します。必要なデータはユーザーによってテキスト ボックスに入力されます。 <br><br>ユーザーがテキスト ボックスに内容を入力し、Enter キーを押すと、プログラムがイベントを取得し、メソッドを呼び出して新しいオブジェクトを作成し、その新しいオブジェクトを todoStore に送信します。バインド機能を使用すると、リストに項目が 1 つ自動的に追加されます。 </div> <br>今度はテキスト ボックスのビューを変換します。insertNewline を覚えていますか?ここで新しいプロジェクトを作成できます。属性値を設定する set()、属性値を取得する get()、データを追加する PushObject() の 3 つのメソッドを使用します。AddItemView を変更した後のコードは次のとおりです。 ><br> <br>コードをコピー<br><br><br> コードは次のとおりです:<br><br> <div class="codetitle">App.AddItemView = Ember.TextField.extend({ <span>placeholder:' ToDo アイテムを入力してください', <a style="CURSOR: pointer" data="45834" class="copybut" id="copybut45834" onclick="doCopy('code45834')">insertNewline:function(){ <u>var item = this.get('value'); </u>App.todoStore.pushObject(item); 'value',''); </a>} </span>}); </div> <div class="codebody" id="code45834"> <br><br>次に、内容を入力して Enter を押します。 todoStore を追加しなかった場合、content 属性の内容がクリアされると、リスト項目は 4 つになります。 <br><br>まだ目標の半分に達しています。優先順位の選択と完了したプロジェクトの削除という 2 つの機能がまだ不足しています。 <br><br>ドロップダウン リストを追加するには、別の便利なビュー Ember.Select を使用できます。テンプレート内で直接作成し、バインドを通じてドロップダウン リスト ビューのコンテンツを別の Ember オブジェクトにバインドして、デフォルトの選択優先度を設定できます。ページ上で選択されると、対応する Ember オブジェクトのコンテンツも同時に変更されるように、優先順位をバインドする必要もあります。まずこの ember オブジェクトを作成し、選択された値を表すようにオブジェクトの selected 属性をカスタマイズします。このコードは todoStore オブジェクトの下に追加され、selectController という名前になります。 <br><br><br> </div>コードをコピー<br><br><br> コードは次のとおりです。<br><br> <br>App.selectController = Ember.Object.create({ <br>selected:' Low', <br>content:['High','Medium','Low'] <div class="codetitle">}); <span><a style="CURSOR: pointer" data="98172" class="copybut" id="copybut98172" onclick="doCopy('code98172')"> <u></u>次に、テンプレート ヘルパーを追加し、 selectController にバインドします。 対応する属性については、選択した項目をバインドするためにselectionBinding が必要です。 変更後のコードは次のとおりです。 </a></span> </div> <div class="codebody" id="code98172">コードをコピー<br><br><br> コードは次のとおりです:<br><div class="codebody" id="code41157"> <br><script type="text/x-handlebars"> <br><span>ToDo アイテムを入力してください: </span>{{view App.AddItemView}}< br/ > <br><span>優先度を選択してください: </span>{{view Ember.Select contentBinding="App.selectController.content"selectionBinding="App.selectController.selected"}} <br> {{ view App.ListView}} <br></script> <br> </div> <br><br>ここでページを更新すると、ドロップダウン リストが表示されます。 <br><br>リスト項目にこの優先順位を持たせたい場合は、やはりある程度の労力を費やす必要があります。次に、モデル クラスを作成します。Enter キーを押して、このクラスからインスタンスを作成し、そのインスタンスを todoStore にスローします。さらに、テキスト ボックス ビューの作成メソッドも変更する必要があります。も変更する必要があります。今回はかなりの変更点があります。さらに、計算された属性関数も使用され、依存する属性が変更されると自動的に更新されます。このモデルに TodoModel という名前を付け、モデル領域に配置し、次のようにコードを作成します。 <br><br><div class="codetitle"> <span><a style="CURSOR: pointer" data="65319" class="copybut" id="copybut65319" onclick="doCopy('code65319')"><u> コードをコピー </u></a></span>コードは次のとおりです: </div> <div class="codebody" id="code65319"> <br>/******************** <br>モデル <br>********************/ <br><br>App.TodoModel = Em.Object.extend({ <br>status:'', <br> value:'', <br>title:function(){ <br>return '[' this.get('status') ']' this.get('value'); <br>}.property('status) ','value') <br>}); <br> </div> <br><br>status は選択の優先順位を表し、value はテキスト ボックスの値を表し、title はテキスト ボックスに表示される内容を表します。これらの属性名はすべてカスタマイズされています。タイトルは、status 属性と value 属性に基づいて計算属性として設定され、自動的に計算されて取得されるため、指定する必要はありません。property() メソッドは、ember 関数が計算属性に変換するメソッドです。以下のパラメータは、ステータスまたは値が依存する属性を表します。値が変更されると、自動的に付与されます。 <br><br> 次に、AddItemView の insertNewline 属性を変更します。1 つはテキスト ボックスの内容、もう 1 つはドロップダウン リストで選択された項目です。テキスト ボックスの値を取得する方法はすでにわかっていますが、ドロップダウン リストの値はどうなるでしょうか?選択した項目を selectController の selected プロパティにバインドしていることを忘れないでください。そこから取得するだけです。変更された AddItemView コードは次のとおりです: <br><br><div class="codetitle"> <span><a style="CURSOR: pointer" data="92832" class="copybut" id="copybut92832" onclick="doCopy('code92832')"><u>コードをコピーします </u></a></span> コードは次のとおりです: </div> <div class="codebody" id="code92832"> <br>App.AddItemView = Ember.TextField.extend({ <br>placeholder:'ToDo 項目を入力', <br>elementId:'add', <br>insertNewline:function(){ <br>var item = App.TodoModel.create ({ <br>status:App.selectController.get('selected'), <br>value:this.get('value') <br>}); PushObject(item); <br>this.set('value',''); <br><br> <br><br>To-Do をインスタンス化できるようになりましたTodoModel クラスを介して item を追加し、todoStore に追加します。最後のステップは、アイテム リストの itemTemplate を変更して、テンプレートに表示するために現在のアイテムのタイトル値を取得する必要があります。コードは次のとおりです。 </div> <br><br><br><br><div class="codetitle">コードをコピー<span><a style="CURSOR: pointer" data="43084" class="copybut" id="copybut43084" onclick="doCopy('code43084')"><u> コードは次のとおりです:</u></a> </span><スクリプト タイプ="text/x-handlebars" data-template-name="itemTemplate"> </div> {{view.content.title}} <div class="codebody" id="code43084"></script> <br><br> <br><br> 追加された新しい To Do アイテムに優先度が表示されるようになりました。 </div> <br>さて、最後の機能、削除です。 PushObject の追加とは逆に、削除には RemoveObject を使用します。各リスト項目に表示されるため、itemViewClass と itemTemplate テンプレートを変更する必要があります。ユーザーがクリックしたときに呼び出されるメソッドを、次のとおりです。<br><br> <br><br><br><div class="codetitle">コードをコピー<span><a style="CURSOR: pointer" data="76601" class="copybut" id="copybut76601" onclick="doCopy('code76601')"><u> コードは次のとおりです。</u></a> </span>App.ListView = Ember.CollectionView.extend({ </div> contentBinding:'App.todoStore', <div class="codebody" id="code76601">tagName:'ul', <br>itemViewClass: Ember.View.extend({ <br>templateName:'itemTemplate', <br>removeItem:function(){this .getPath ( 'contentView.content' ).removeObject(this.get( 'content' ));} <br>}) <br>}); <br><br> <br><br>最後に itemTemplate にテンプレート クリックを受け入れるリンクを追加するには、アクション アシスタントが使用されます。最初のパラメータは、オブジェクトを指定するために使用されます。変更された itemTemplate コードは次のとおりです: </div> <br><br><br><br><div class="codetitle">コードをコピーします <span><a style="CURSOR: pointer" data="49493" class="copybut" id="copybut49493" onclick="doCopy('code49493')"><u> コードは次のとおりです: </u><div class="codebody" id="code49493"> <br><script type="text/x-handlebars" data-template-name="itemTemplate"> <br>{{view.content.title}} <a href="#" { {action removeItem target="this"}} > The current project will be deleted. <br><br>Finally, some improvements can be made. The delete link will only be displayed when the mouse moves over the item. To complete this function, you need to modify the itemViewClass and add a logical judgment assistant {{#if}} to the template. You can try it yourself, or you can take a look at the final complete code. </div> <br><br><br><br><br>Copy code<br><div class="codetitle"> <span> The code is as follows:<a style="CURSOR: pointer" data="57375" class="copybut" id="copybut57375" onclick="doCopy('code57375')"><u> </u>full code </a><!doctype html> </span><html> </div><head> <div class="codebody" id="code57375"><meta charset="utf-8"> <br><title>Ember--the first application



<script> <br><br>/******************** <br>application <br>********************/ <br><br>window.App = Ember.Application.create( <br>{ <br>ready :function(){ <br>Em.Logger.info('Welcome to the To-Do App'); <br>} <br>} <br>); <br><br>/******************** <br>model <br>******************** / <br><br>App.TodoModel = Em.Object.extend({ <br>status:'', <br>value:'', <br>title:function(){ <br>return '[' this.get('status') ']' this.get('value'); <br>}.property('status','value') <br>}); <br><br>/** ****************** <br>view <br>********************/ <br>App.AddItemView = Ember.TextField.extend({ <br>placeholder:'Enter to-do item', <br>elementId:'add', <br>insertNewline:function(){ <br>var item = App.TodoModel.create({ <br>status:App.selectController.get('selected'), <br>value:this.get('value') <br>}); <br> App.todoStore.pushObject(item); <br>this.set('value',''); <br>} <br>}); <br><br>App.ListView = Ember.CollectionView.extend( { <br>contentBinding:'App.todoStore', <br>tagName:'ul', <br>itemViewClass: Ember.View.extend({ <br>templateName:'itemTemplate', <br>removeItem:function() {this.getPath( 'contentView.content' ).removeObject(this.get( 'content' ));}, <br>mouseEnter:function(){this.set('hover',true);}, <br>mouseLeave:function(){this.set('hover',false);} <br>}) <br>}); <br><br><br><br>/******************** <br>controls <br>*****************/ <br>App.todoStore = Ember.ArrayController.create({ <br>content:[] <br>}); <br><br>App.selectController = Ember.Object.create({ <br>selected:' Low', <br>content:['High','Medium','Low'] <br>}); <br><br></script>

< ;body>