Weitere ähnliche Inhalte Mehr von Toshio Ehara (20) Kürzlich hochgeladen (11) JavaScriptもBACKBONE.JSならスッキリ ~MVCぽいのを初体験!~8. $(function(){
// menu表のデータを取得
$.ajax({
url:'/assets/g/q/B/s/gqBsC',
dataType: 'json',
}).done(function( menuList ) {
// メニュー表の作成
var $menuTable = $('#menu');
_.each( menuList, function( item, idx){
var $tr = $('<tr>');
$menuTable.append( $tr);
var $chk = $('<input type="checkbox" />').data({
"idx":idx,
"name":item.name,
"price":item.price});
$tr.append( $('<td>').append( $chk))
.append( $('<td>').text( item.name))
.append( $('<td>').text( item.price));
});
// イベントの取り付け
$menuTable.on('click','input[type=checkbox]',function(event){
13年7月28日日曜日
18. <div id="application" >
<h1 class="menu-title" >
メニュー表
</h1>
<table id="menu-table" >
</table>
<div id="sum-price-pane" >
<script id="sum-price-pane-template" type="text/template" >
合計:<span ><%= sumPrice %></span>
</script>
</div>
</div>
13年7月28日日曜日
21. var object = {};
_.extend(object, Backbone.Events);
object.on("alert", function(msg) {
alert("Triggered " + msg);
});
object.trigger("alert", "an event");
http://backbonejs.org/
Underscore.jsの機能:
オブジェクトのすべてのプロパティを
別オブジェクトにコピー
13年7月28日日曜日
25. var MenuItem = Backbone.Model.extend({
defaults:{
checked: false, //:boolean 選択フラグ
name: "", //:string ハンバーガー名
price: 0 //:number お値段
},
toggleChecked: function(){
this.set("checked", !this.get("checked") );
}
})
13年7月28日日曜日
26. [
{ "name": "ハンバーガ", "price": 300 },
{ "name": "チーズバーガ", "price": 400 },
{ "name": "照り焼きバーガ", "price": 500 },
{ "name": "スペシャル", "price": 600 }
]
http://jsrun.it/assets/a/6/2/V/a62Vk
13年7月28日日曜日
35. var MenuListView = Backbone.View.extend({
el:'#menu-table',
initialize: function(options){
this.listenTo(this.collection, //:MenuList
'reset',this.listRender);
},
listRender: function(){
this.collection.each(this.createMenuItem,this);
},
createMenuItem: function(menuItem){
var opt = {model:menuItem};
var menuItemView = new MenuItemView(opt);
menuItemView.createRender();
this.$el.append( menuItemView.$el);
}
});
13年7月28日日曜日
36. var SumPriceView = Backbone.View.extend({
el: '#sum-price-pane',
initialize: function(options){
this.template = _.template( $('#' + this.el.id + '-template').html() );
this.listenTo(this.collection,'reset',this.render);
this.listenTo(this.collection,'change',this.render);
},
render: function(){
var menuList = this.collection;
var sumPrice = menuList.sumPrice();
var html = this.template( { sumPrice: sumPrice } );
this.$el.empty()
.html( html );
}
});
13年7月28日日曜日
37. <div id="application" >
<table id="menu" ></table>
<table id="selected-menu"></table>
<div id="sum-price-pane" >
<script id="sum-price-pane-template" type="text/template" >
合計:<span ><%= sumPrice %></span>
</script>
</div>
</div>
var SumPriceView = Backbone.View.extend({
el: '#sum-price-pane',
・・・省略・・・
initialize: function(options){
this.template = _.template( $('#' + this.el.id + '-template').html() );
・・・省略・・・
},
render: function(){
var menuList = this.collection;
var price = menuList.sumPrice();
var html = this.template( { sumPrice: price } );
this.$el.empty()
.html( html );
}
});
$(‘#id’)でテンプレート書式を取得してま
す。以下3種類があります。
<%= そのまま %>
<%- エスケープ %>
<% JavaScript実行 %>
同名プロパティの設定値が
テンプレートの中で使用されます。
13年7月28日日曜日
39. var ApplicationView = Backbone.View.extend({
el: '#application',
initialize: function(options){
this.collection = new MenuList();
var op = { collection:this.collection};
var menuListView = new MenuListView(op);
var selectedListView = new SelectedListView(op);
var sumPriceView = new SumPriceView(op);
},
start: function(){
this.collection.fetch({reset: true});
}
});
$(function(){
(new ApplicationView()).start();
});
一つのCollection(Model)
を複数のViewが利用する事で
複数のView間の整合性が保た
れます。
アプリケーション開始時に
APIサーバにGETしてJSON取得し
ます。
[注]{reset:true}が無いと
resetイベントが発火しません。
13年7月28日日曜日