パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください -10ページ目

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

こんばんは。ゆんぼうです。

今回は、Backbone.jsを使用して、リストと登録ボタンを作成します。

今回使用する環境は下記の通りです。

Webブラウザ
・Mozilla Firefox (v34.05) https://www.mozilla.org/ja/firefox/new/
・FireBug (v2.0.7) https://addons.mozilla.org/ja/firefox/addon/firebug/

JavaScriptライブラリ
・Backbone.js (v1.1.2) http://backbonejs.org/
・Underscore.js (v1.7.0) http://underscorejs.org/
・jQuery (v2.1.1) http://jquery.com/



■リストと登録ボタン

【デモはこちら】
【ソースファイルはこちら】

リストと登録ボタンを作成します。
登録ボタンを押下すると、リストに追加されます。

index.html の head に下記の内容を記述します。


<script type="text/template" id="template-user-list-item">
<%= label.name %>
</script>
<script type="text/template" id="template-user-register">
<label for="id_input_name"><%= label.name %></label>
<input id="id_input_name" type="text">
<br>
<input id="id_button_regist" type="button" value="<%= label.registButton %>">
<hr>
</script>


main.js に下記の内容を記述します。


$(function() {

var UserModel = Backbone.Model.extend({ // (1)
defaults : {
'name' : ''
}
});

var UserCollection = Backbone.Collection.extend({ // (2)
model : UserModel
});

var UserListView = Backbone.View.extend({
name : 'UserListView',
tagName : 'ul',
initialize : function(args) {
this.collection = args.collection;
this.listenTo(this.collection, 'add', this.onAdd);
},
render : function() {
this.$el.html('');
_.each(this.collection.models, function(model) {
this.$el.append((new UserListItemView({
'model' : model
})).render().el);
}, this);
return this;
},
onAdd : function() { // (5)
console.log(this.name + '#onAdd');
this.render();
}
});

var UserListItemView = Backbone.View.extend({
name : 'UserListItemView',
tagName : 'li',
initialize : function(args) {
this.model = args.model;
this.compiledTemplate = _.template($('#template-user-list-item').text());
},
render : function() {
var templateData = {
'label' : {
'name' : this.model.get('name')
}
};
this.$el.append(this.compiledTemplate(templateData));
return this;
}
});

var UserRegisterView = Backbone.View.extend({
name : 'UserRegisterView',
events : {
'click #id_button_regist' : 'onClickRegistButton'
},
initialize : function(args) {
this.collection = args.collection;
this.compiledTemplate = _.template($('#template-user-register').text());
},
render : function() {
var templateData = {
'label' : {
'name' : '名前 : ',
'registButton' : '登録'
}
};
this.$el.append(this.compiledTemplate(templateData))
return this;
},
onClickRegistButton : function() { // (4)
console.log(this.name + '#onClickRegistButton');
this.collection.add({
'name' : this.$el.find('#id_input_name').val()
});
}
});

var BaseView = Backbone.View.extend({
name : 'BaseView',
initialize : function() { // (3)
this.collection = new UserCollection();
this.userListView = new UserListView({
'collection' : this.collection
});
this.userRegisterView = new UserRegisterView({
'collection' : this.collection
});
},
render : function() {
this.$el.append(this.userRegisterView.render().el).append(this.userListView.render().el);
return this;
}
});

var baseView = new BaseView();
$('body').append(baseView.render().el);
});


(1)ユーザーの情報を表す UserModel を定義します。
(2) UserModel の配列を表す UserCollection を定義します。
(3) BaseView がページ全体のViewになります。BaseView の initialize 関数で、UserCollection のオブジェクトを生成して、それぞれのSubViewに渡しています。
(4) UserRegisterView の onClickRegistButton 関数で、登録ボタン押下時に UserCollection にデータを追加しています。
(5) UserCollection にデータが追加された場合、add イベントを発火されます。その後、 UserListView の onAdd が実行され、UserCollection のデータを元にリストが描画されます。



■バリデーション

【デモはこちら】
【ソースファイルはこちら】

リストと登録ボタンを拡張します。
Modelの validate 関数を用いて、何も入力されていない状態で
登録ボタンを押下すると、アラートが表示されるように修正します。

main.js に下記の内容を記述します。


var UserModel = Backbone.Model.extend({
defaults : {
'name' : ''
},
validate : function(attribuite) { // (1)
if (_.isEmpty(attribuite.name)) {
return "名前が入力されていません";
}
}
});


(1) UserModel に validate 関数を追加します。ここでは、name 属性が空の場合、メッセージを返します。


var UserRegisterView = Backbone.View.extend({
name : 'UserRegisterView',
events : {
'click #id_button_regist' : 'onClickRegistButton'
},
initialize : function(args) {
this.collection = args.collection;
this.listenTo(this.collection, 'invalid', this.onInvalid);
this.compiledTemplate = _.template($('#template-user-register').text());
},
render : function() {
var templateData = {
'label' : {
'name' : '名前 : ',
'registButton' : '登録'
}
};
this.$el.append(this.compiledTemplate(templateData))
return this;
},
onClickRegistButton : function() {
console.log(this.name + '#onClickRegistButton');
this.collection.add({
'name' : this.$el.find('#id_input_name').val(),
}, {
validate : true // (1)
});
},
onInvalid : function(collection, message) { // (2)
console.log(this.name + '#onInvalid');
alert(message);
}
});


(1) UserCollection にデータを追加する引数に、validate : true を追記します。この追記で、 UserCollection の add 関数を実行すると、 UserCollection の validate 関数も実行されます。
(2) UserCollection の validate 関数が実行され、検証に失敗すると、invalid イベントが発火されます。その後、UserRegisterView の onInvalid 関数が実行され、アラートが表示されます。

以上です。



□過去の記事

Backbone.js入門その6「ModelとCollection」
Backbone.js入門その5「静的HTMLでBackbone.Viewを作る」
Backbone.js入門その4「SuperViewとSubViewのアクセスを作成する」
Backbone.js入門その3「Backbone.ViewでSubViewを作る」
Backbone.js入門その2「Backbone.Viewで複数の要素を作る」
Backbone.js入門その1「Backbone.Viewで1つの要素を作る」
こんばんは。ゆんぼうです。

今回は、Backbone.jsのBackbone.ModelとBackbone.Collectionを使ったViewを作成します。
Modelは、データを表します。
Backbone.jsでは、データの更新や検証、Ajax通信などの機能を提供します。
Collectionは、Modelの配列を表します。
Backbone.jsでは、配列の追加、削除、並び替えなどの機能を提供します。

今回使用する環境は下記の通りです。

Webブラウザ
・Mozilla Firefox (v34.05) https://www.mozilla.org/ja/firefox/new/
・FireBug (v2.0.7) https://addons.mozilla.org/ja/firefox/addon/firebug/

JavaScriptライブラリ
・Backbone.js (v1.1.2) http://backbonejs.org/
・Underscore.js (v1.7.0) http://underscorejs.org/
・jQuery (v2.1.1) http://jquery.com/



■プルダウン

【デモはこちら】
【ソースファイルはこちら】

以前の記事で作成したプルダウンを
今回は、ModelとCollectionを使用して作成します。

index.html のhead に下記の内容を記述します。
こちらは前回と同じです。


<script type="text/template" id="template-programing-subview">
<label for="language"><%= title %></label>
<select id="language"></select>
</script>


main.js に下記の内容を記述します。


$(function() {

var ProgramingLanguageModel = Backbone.Model.extend({ // (1)
defaults : { // (2)
'name' : '',
'value' : 0
}
});

var ProgramingLanguageCollection = Backbone.Collection.extend({ // (3)
model : ProgramingLanguageModel // (4)
});

var SampleView = Backbone.View.extend({

events : {
'change #language' : 'onChange'
},
initialize : function() {
this.compiledTemplate = _.template($('#template-programing-subview').text());
this.collection = new ProgramingLanguageCollection([ { // (5)
'name' : 'JavaScript',
'value' : 1
}, {
'name' : 'Java',
'value' : 2
}, {
'name' : 'C言語',
'value' : 3
}, {
'name' : 'Ruby',
'value' : 4
}, {
'name' : 'Python',
'value' : 5
} ]);
},
render : function() {
var data = {
'title' : 'プログラミング言語を選択してください'
};
this.$el.append(this.compiledTemplate(data));
_.each(this.collection.models, function(model) { // (6)
this.$el.find('#language').append((new OptionView(model)).render().el);
}, this);
return this;
},
onChange : function(event) {
console.log('onChange:' + event.target.value);
}
});

var OptionView = Backbone.View.extend({
tagName : 'option',
initialize : function(model) {
this.label = model.get('name'); // (7)
this.attributes = {
'value' : model.get('value') // (8)
};
},
render : function() {
this.$el.html(this.label);
return this;
}
});

var sampleView = new SampleView();
$('body').append(sampleView.render().el);
});


(1)Modelを定義します。Modelは、Backbone.Model.extend()関数を使用します。
(2)defaultsプロパティで、デフォルト値の設定を行います。
(3)Collectionを定義します。Collectionは、Backbone.Collection.extend()関数を使用します。
(4)CollectionにModelを設定します。ProgramingLanguageCollection は、ProgramingLanguageModel の配列を持つということを表します。
(5)Viewのinitialize関数で、ProgramingLanguageCollectionのオブジェクトを生成しています。その引数に、5つ分のデータを設定しています。
このとき、ProgramingLanguageCollection には、5つ分のProgramingLanguageModelを保持しています。
(6)Viewのrender関数で、Collectionの配列のサイズ分をSubViewに追加しています。this.collection.models は、ProgramingLanguageModelの配列を指します。
(7)1つ分のProgramingLanguageModelから、nameプロパティを取得しています。
(8)1つ分のProgramingLanguageModelから、valueプロパティを取得しています。

以上です。



□過去の記事

Backbone.js入門その5「静的HTMLでBackbone.Viewを作る」
Backbone.js入門その4「SuperViewとSubViewのアクセスを作成する」
Backbone.js入門その3「Backbone.ViewでSubViewを作る」
Backbone.js入門その2「Backbone.Viewで複数の要素を作る」
Backbone.js入門その1「Backbone.Viewで1つの要素を作る」

こんばんは。ゆんぼうです。

今回は、Backbone.jsで、
静的HTMLでViewを作成します。

前回までは、htmlのbodyにBackbone.Viewのelをappendして、Webページを表示しておりましたが、
今回は、htmlのbodyに要素を直接記述して、要素のidをBackbone.Viewのelに紐付けて表示します。

今回使用する環境は下記の通りです。

Webブラウザ
・Mozilla Firefox (v34.05) https://www.mozilla.org/ja/firefox/new/
・FireBug (v2.0.7) https://addons.mozilla.org/ja/firefox/addon/firebug/

JavaScriptライブラリ
・Backbone.js (v1.1.2) http://backbonejs.org/
・Underscore.js (v1.7.0) http://underscorejs.org/
・jQuery (v2.1.1) http://jquery.com/


index.html のbody に下記の内容を記述します。


<div id="id_buttons">
<input id="id_button_update" type="button" value="更新">
<input id="id_button_delete" type="button" value="削除">
</div>




■ViewにIDを定義する

【デモはこちら】
【ソースファイルはこちら】

Viewのelに要素のIDを定義して、Webページを表示します。
main.js に下記の内容を記述します。


$(function() {
var BaseView = Backbone.View.extend({
el : '#id_buttons', // (1)
events : {
'click #id_button_update' : 'onClickUpdateButton',
'click #id_button_delete' : 'onClickDeleteeButton'
},
onClickUpdateButton : function(event) {
console.log('onClickUpdateButton');
},
onClickDeleteeButton : function(event) {
console.log('onClickDeleteeButton');
}
});

var baseView = new BaseView();
});


(1)BaseViewのelプロパティに要素ID「id_buttons」を定義します。
そのBaseViewを new すると、要素IDとBaseView.Viewが紐付けられます。
(※ボタンを押下すると、ログが出力されることで、紐付けが確認できます。)



■IDをViewに渡す

【デモはこちら】
【ソースファイルはこちら】

Viewのオブジェクトに、要素IDを渡します。
main.js に下記の内容を記述します。


$(function() {
var ButtonView = Backbone.View.extend({
events : {
'click' : 'onClick'
},
onClick : function(event) {
console.log(event.target.id + '#onClick');
}
});

var buttonView1 = new ButtonView({ // (1)
'el' : '#id_button_update'
});

var buttonView2 = new ButtonView({ // (2)
'el' : '#id_button_delete'
});
});


(1)更新ボタンの要素ID「id_button_update」を渡して、ButtonViewのオブジェクト生成します。
更新ボタンとButtonViewが紐付けられます。
(2)削除ボタンも同様です。

更新ボタンと削除ボタンはそれぞれ別々のViewオブジェクトとなります。

以上です。



□過去の記事

Backbone.js入門その4「SuperViewとSubViewのアクセスを作成する」
Backbone.js入門その3「Backbone.ViewでSubViewを作る」
Backbone.js入門その2「Backbone.Viewで複数の要素を作る」
Backbone.js入門その1「Backbone.Viewで1つの要素を作る」
こんばんは。ゆんぼうです。

今回は、Backbone.jsで、
SuperViewとSubViewのアクセスを作成します。

具体的には、
更新と削除の2つのボタンを表示して、
押下すると、それぞれのボタン固有の文字列を表示する内容を作成します。

今回使用する環境は下記の通りです。

Webブラウザ
・Mozilla Firefox (v34.05) https://www.mozilla.org/ja/firefox/new/
・FireBug (v2.0.7) https://addons.mozilla.org/ja/firefox/addon/firebug/

JavaScriptライブラリ
・Backbone.js (v1.1.2) http://backbonejs.org/
・Underscore.js (v1.7.0) http://underscorejs.org/
・jQuery (v2.1.1) http://jquery.com/



■SubViewにSuperViewのオブジェクトを渡す

【デモはこちら】
【ソースファイルはこちら】

SubViewにSuperViewのオブジェクトを渡して
それぞれのSubViewでボタンを押下すると
SuperViewの関数を実行して文字列を描画します。

main.js に下記の内容を記述します。


$(function() {
var BaseView = Backbone.View.extend({
initialize : function() { // (1)
this.updateButtonView = new UpdateButtonView({
'parent' : this
});
this.deleteButtonView = new DeleteButtonView({
'parent' : this
});
},
render : function() {
this.$el.append($('
', {
'id' : 'id_label'
}));
this.$el.append(this.updateButtonView.el).append(this.deleteButtonView.el);
return this;
},
renderLabel : function(message) {
this.$el.find('#id_label').html(message); // (4)
}
});

var UpdateButtonView = Backbone.View.extend({
tagName : 'input',
id : 'id_button_update',
attributes : {
type : 'button',
value : '更新'
},
events : {
'click' : 'onClick',
},
initialize : function(args) {
this.parent = args.parent; // (2)
},
onClick : function(event) {
console.log('UpdateButtonView#onClick');
this.parent.renderLabel('UpdateButtonView'); // (3)
}
});

var DeleteButtonView = Backbone.View.extend({
tagName : 'input',
id : 'id_button_delete',
attributes : {
type : 'button',
value : '削除'
},
events : {
'click' : 'onClick',
},
initialize : function(args) {
this.parent = args.parent;
},
onClick : function(event) {
console.log('DeleteButtonView#onClick');
this.parent.renderLabel('DeleteButtonView');
}
});

var baseView = new BaseView();
$('body').append(baseView.render().el);
});


BaseView がSuperView(親View)で、
UpdateButtonViewとDeleteButtonViewがSubView(子View)となります。

(1)SuperViewのinitialize関数で、SubViewを定義します。new する際にSuperView(this)をSubViewの引数に渡しています。
(2)SubViewのinitialize関数で、SuperViewのオブジェクトを保持しています。
更新ボタンを押下した場合は、(3)UpdateButtonViewのonClick関数が実行され、SuperViewのrenderLabel関数が実行され、(4)で文字列を描画します。
削除ボタンを押下した場合も同様です。



■イベント(listenToとtrigger)を使う

【デモはこちら】
【ソースファイルはこちら】

別の方法として、
SuperViewでSubViewのイベントを監視して、
それぞれのSubViewでボタンを押下すると
イベントを発火して、そのイベントをハンドリングすることで文字列を描画します。

main.js に下記の内容を記述します。


$(function() {

var BaseView = Backbone.View.extend({
initialize : function() { // (1)
this.updateButtonView = new UpdateButtonView();
this.deleteButtonView = new DeleteButtonView();
this.listenTo(this.updateButtonView, 'update', this.onUpdate);
this.listenTo(this.deleteButtonView, 'delete', this.onDelete);
},
render : function() {
this.$el.append($('
', {
'id' : 'id_label'
}));
this.$el.append(this.updateButtonView.el).append(this.deleteButtonView.el);
return this;
},
renderLabel : function(message) {
this.$el.find('#id_label').html(message);
},
onUpdate : function(message) {
console.log('BaseView#onUpdate'); // (3)
this.renderLabel(message);
},
onDelete : function(message) {
console.log('BaseView#onDelete');
this.renderLabel(message);
}
});

var UpdateButtonView = Backbone.View.extend({
tagName : 'input',
id : 'id_button_update',
attributes : {
type : 'button',
value : '更新'
},
events : {
'click' : 'onClick',
},
onClick : function(event) {
console.log('UpdateButtonView#onClick');
this.trigger('update', 'UpdateButtonView'); // (2)
}
});

var DeleteButtonView = Backbone.View.extend({
tagName : 'input',
id : 'id_button_delete',
attributes : {
type : 'button',
value : '削除'
},
events : {
'click' : 'onClick',
},
onClick : function(event) {
console.log('DeleteButtonView#onClick');
this.trigger('delete', 'DeleteButtonView');
}
});

var baseView = new BaseView();
$('body').append(baseView.render().el);
});


(1)SuperViewのinitialize関数で、SubViewを定義します。それぞれのSubViewに対して、listenToでイベントを監視します。
・UpdateButtonView は、「update」イベントを監視。イベント発火時には、onUpdate関数が実行されます。
・DeleteButtonView は、「delete」イベントを監視。イベント発火時には、onDelete関数が実行されます。
更新ボタンが押下した場合、(2)UpdateButtonViewのonClick関数が実行され、「update」イベントを発火します。(3)SuperViewのonUpdate関数が実行されます。
triggerの第2引数には、SuperViewで描画する文字列を設定します。そうすると、SuperViewのonUpdate関数の引数に渡されます。
削除ボタンを押下した場合も同様です。

以上です。



□過去の記事

Backbone.js入門その3「Backbone.ViewでSubViewを作る」
Backbone.js入門その2「Backbone.Viewで複数の要素を作る」
Backbone.js入門その1「Backbone.Viewで1つの要素を作る」
こんばんは。ゆんぼうです。

今回は、Backbone.jsで、
SubViewを作成します。SubViewとは、自分のViewに追加するViewのことです。

今回使用する環境は下記の通りです。

Webブラウザ
・Mozilla Firefox (v34.05) https://www.mozilla.org/ja/firefox/new/
・FireBug (v2.0.7) https://addons.mozilla.org/ja/firefox/addon/firebug/

JavaScriptライブラリ
・Backbone.js (v1.1.2) http://backbonejs.org/
・Underscore.js (v1.7.0) http://underscorejs.org/
・jQuery (v2.1.1) http://jquery.com/



■2つのボタン

【デモはこちら】
【ソースファイルはこちら】

2つのボタンについて
前回はテンプレートを使用しましたが、
今回は使用せずにSubViewを使用して作成します。

main.js に下記の内容を記述します。


$(function() {

var SampleView = Backbone.View.extend({

events : {
'click #id_button_update' : 'onClickUpdate',
'click #id_button_delete' : 'onClickDelete',
},
initialize : function() { // (1)
this.updateButtonView = new UpdateButtonView();
this.deleteButtonView = new DeleteButtonView();
},
render : function() {
this.$el.append(this.updateButtonView.el).append(this.deleteButtonView.el); // (2)
return this;
},
onClickUpdate : function(event) {
console.log('onClickUpdate');
},
onClickDelete : function(event) {
console.log('onClickDelete');
}
});

var UpdateButtonView = Backbone.View.extend({ // (3)
tagName : 'input',
id : 'id_button_update',
attributes : {
type : 'button',
value : '更新'
}
});

var DeleteButtonView = Backbone.View.extend({ // (4)
tagName : 'input',
id : 'id_button_delete',
attributes : {
type : 'button',
value : '削除'
}
});

var sampleView = new SampleView();
$('body').append(sampleView.render().el);
});


2つボタンを表すViewは UpdateButtonView と DeleteButtonView です。

SampleView で、UpdateButtonView、DeleteButtonViewのオブジェクトを生成してから
SampleView自身に、追加しています。

SampleView が親のView、
UpdateButtonView、DeleteButtonView が子のView(SubView)となります。

(1)initialize関数で、UpdateButtonView、DeleteButtonViewのオブジェクトを生成します。
(2)render関数で、自分のViewに、UpdateButtonView、DeleteButtonViewを追加します。
(3)UpdateButtonViewのオブジェクトを定義します。
(4)DeleteButtonViewのオブジェクトを定義します。



■プルダウン

【デモはこちら】
【ソースファイルはこちら】

プルダウンのoptionタグについて
前回はテンプレートを使用しましたが、
今回は使用せずにSubViewを使用して作成します。

まず、index.htmlのheadに以下の内容を追加します。


<script type="text/template" id="template-programing-subview">
<label for="language"><%= title %></label>
<select id="language"></select>
</script>


次に、main.js に下記の内容を記述します。


$(function() {

var SampleView = Backbone.View.extend({

events : {
'change #language' : 'onChange'
},
initialize : function() {
this.compiledTemplate = _.template($('#template-programing-subview').text()); // (1)
this.optionList = [ // (2)
new OptionView({'label' : 'JavaScript','attributes' : {'value' : '1'}}),
new OptionView({'label' : 'Java','attributes' : {'value' : '2'}}),
new OptionView({'label' : 'C言語','attributes' : {'value' : '3'}}),
new OptionView({'label' : 'Ruby','attributes' : {'value' : '4'}}),
new OptionView({'label' : 'Python','attributes' : {'value' : '5'}})
];
},
render : function() {
var data = {
'title' : 'プログラミング言語を選択してください'
};
this.$el.append(this.compiledTemplate(data)); // (3)
_.each(this.optionList, function(option) {
this.$el.find('#language').append(option.render().el); // (4)
}, this);
return this;
},
onChange : function(event) {
console.log('onChange:' + event.target.value);
}
});

var OptionView = Backbone.View.extend({ // (5)
tagName : 'option',
initialize : function(args) {
this.label = args.label;
},
render : function(){
this.$el.html(this.label);
return this;
}
});

var sampleView = new SampleView();
$('body').append(sampleView.render().el);
});


プルダウンのoptionタグを表すViewが OptionView です。
SampleView で 5つ分の OptionView のオブジェクトを生成してから
SampleView自身に、追加しています。

SampleView が親のView、
5つの OptionView が子のView(SubView)となります。

(1)テンプレートIDを指定して、テンプレート関数を生成します。
(2)SubViewの配列を作成します。
(3)自分のViewにテンプレートを追加します。
(4)テンプレート内のID「language」に対して、SubViewを追加します。
(5)SubViewを定義します。

以上です。



□過去の記事

Backbone.js入門その2「Backbone.Viewで複数の要素を作る」
Backbone.js入門その1「Backbone.Viewで1つの要素を作る」