Marionette.js(Backbone.js)のチュートリアル with yeoman その2(Modelと基本View側実装編)
marionette.jsのチュートリアルの続き。
ここから、クライアント側の話。
先に言うと、メインのmarionetteは、この記事でなく、その3なので読んで飽きてきたら、その3に飛ぶべし。
前回に引き続き、gruntを起動している状態で進める事。
もし、起動していなければ、gruntを起動する。
model
初めにmodel を作る。
railsみたいに、MVC,routerそれぞれのgeneratorが準備されているので、勿論それを使う。
$ yo marionette:model task create app/scripts/models/task.js invoke mocha-amd:unitTest create test/spec/models/task.js conflict test/spec/testSuite.js [?] Overwrite test/spec/testSuite.js? overwrite force test/spec/testSuite.js
上書き聞かれたらenter!
これで、基本的なmodel + testのひな形が出来ている。
気になる人は、以下のファイルを見てみよう。
- app/scripts/models/task.js
- test/spec/models/task.js
ここから、ようやく、プログラミングしていく。
- さっき作ったAPIのendpointと繋げる
//app/scripts/models/task.js urlRoot: "/api/v1/tasks",
それと、重要なのは、mongodbはidが「_id」なのに、その設定が今のgeneratorに無いので、付ける
- ※近く、pull reqしておきます。
idAttribute: "_id";
画面作成
ここから画面を作る。
まずは、taskを新規登録するためのinputタグを作る。
//app/index.html <div class="hero-unit"> <input type="TEXT" id="new-todo" placeholder="ここに何か書いてEnter"></input> </div>
あと、余計なsample描写処理を消しておく
diff --git a/app/scripts/application.js b/app/scripts/application.js @@ -16,7 +16,6 @@ - document.body.innerHTML = welcomeTmpl({ success: "CONGRATS!" });
ここまでで、基本的な画面がブラウザに出来てるはず。
View
さて、このinputタグにtask追加用のイベントを
登録させたいので、Viewを追加する。
ここで、そろそろ、marionetteのItemViewを使いたい所だが、
この場合、単に追加イベントを登録したいだけで、
render処理やtemplateも要らないので、BackboneのViewで十分。
なので、BackboneのViewを使う。これもgenerator使う。
$ yo marionette:view new_task
注意:ハイフン区切りでなく、アンスコ区切りで。
ちなみに、ここで、元のgenerator-marionetteのページのように、new-task(ハイフン区切り)と書くと、こんなエラーになる。
Running "exec:mocha" (exec) task SyntaxError: Parse error >> Exited with code: 1.
これは、今の作りだと、そのままmochaのテストの変数もハイフンはいってしまいエラーになってるため。
なので、ハイフン区切り(とかラクダとか)でgenerator使った方がいい。※せっかく、generator使ってるのに一々直したら面倒臭いしね。文句がある人は、pull reqを...
Eventを追加する。
new_taskのviewに、eventを追加して、
enterボタン押された時のメソッドを準備する。
diff --git a/app/scripts/application.js b/app/scripts/application.js @@ -1,23 +1,26 @@ define([ 'backbone', 'communicator', - 'hbs!tmpl/welcome' + 'views/new_task' ], -function( Backbone, Communicator, Welcome_tmpl ) { +function( Backbone, Communicator, NewTaskView ) { 'use strict'; - var welcomeTmpl = Welcome_tmpl; - var App = new Backbone.Marionette.Application(); /* Add application regions here */ - App.addRegions({}); + App.addRegions({ + newTask: "#new-todo" + }); /* Add initializers here */ App.addInitializer( function () { Communicator.mediator.trigger("APP:START"); + App.newTask.attachView(new NewTaskView({el: App.newTask.el})); }); return App; }); diff --git a/app/scripts/views/new_task.js b/app/scripts/views/new_task.js @@ -5,8 +5,17 @@ function(Backbone){ 'use strict'; return Backbone.View.extend({ + el: "#new-todo", + events: { + "keypress": "postTask" + }, initialize: function() { console.log("initialize a NewTask View"); - } + }, + postTask: function(event){ + if(event.keyCode == 13){ + console.log("ENTERED!"); + } + }
- ItemViewではなく、ただの生のViewなので、自分でelとか追加しないといけない
- それでも、あくまで、regionにelを外出ししておくと、後で、自分のソースが読み易い。
- (全体として、どういう画面でできているのか、region見れば分かる状態になる。)
ここから
さて、これで、Modelと新規作成できるViewができた。
ここで、メインディッシュのMarionetteの
ItemViewとCollectionViewが出てくるのだが...
長くなったので、ここで、また一旦切る。