8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Backbone.js事始め その5 イベント処理

Last updated at Posted at 2014-09-27

前回の記事で発見した記述ミスによる挙動の違いに気づいたので覚え書き。
モデルの初期化時にイベントを定義してみた。基本的には簡単な記述ミスであるのだが、全く違う挙動を見せるので下記にパターンを記す。

on('change:name',function(){})
on('change :name',function(){})
on('change: name',function(){})
on('change : name',function(){})

属性のchangeイベントをハンドラの定義する時に、on('change:name',function(){})と記述するわけであるが、思わずスペースを入れてしまうと挙動が異なる。一番の問題はエラーにならないので、非常に気付きにくい。

ソースコード

	<script type="text/javascript">
	(function() {
		//----------
		// Model作成
		//----------
		var Person = Backbone.Model.extend({
			//Attribute(属性)
			defaults: {
				name: "None",
				age: 0
			},
			//コンストラクタ
			initialize: function(){
				console.log("初期化処理開始 : " + this.get("name"));
				//イベント定義
				this.on('change:name', function(){
			 		console.log("名前が変わりました。");
				}),
				this.on('change:age', function(){
			 		console.log("年齢が変わりました。");
				})
				console.log("初期化処理修了 : " + this.get("name"));
			}
		});
		//モデルのインスタンス化	
		var none = new Person();
		none.set('name','ほげほげ');
		//表示
		console.log("私は、" + none.get('name') + " " + none.get('age') + "歳です。");
		none.set('age',26);
		//表示
		console.log("私は、" + none.get('name') + " " + none.get('age') + "歳です。");
	})();
	</script>

スペース無しの場合 ※正しい記述

//コンストラクタ
initialize: function(){
	console.log("初期化処理開始 : " + this.get("name"));
	//イベント定義
	this.on('change:name', function(){
 		console.log("名前が変わりました。");
	}),
	this.on('change:age', function(){
 		console.log("年齢が変わりました。");
	})
	console.log("初期化処理修了 : " + this.get("name"));
}
});

スクリーンショット 2014-09-27 21.33.24.png

スペース有り(前)の場合 ※記述ミス1

//コンストラクタ
initialize: function(){
	console.log("初期化処理開始 : " + this.get("name"));
	//イベント定義
	this.on('change :name', function(){
 		console.log("名前が変わりました。");
	}),
	this.on('change :age', function(){
 		console.log("年齢が変わりました。");
	})
	console.log("初期化処理修了 : " + this.get("name"));
}
});

スクリーンショット 2014-09-27 21.36.30.png

スペース有り(後)の場合 ※記述ミス2

//コンストラクタ
initialize: function(){
	console.log("初期化処理開始 : " + this.get("name"));
	//イベント定義
	this.on('change: name', function(){
 		console.log("名前が変わりました。");
	}),
	this.on('change: age', function(){
 		console.log("年齢が変わりました。");
	})
	console.log("初期化処理修了 : " + this.get("name"));
}
});

スクリーンショット 2014-09-27 21.37.35.png

スペース有り(両側)の場合 ※記述ミス3

//コンストラクタ
initialize: function(){
	console.log("初期化処理開始 : " + this.get("name"));
	//イベント定義
	this.on('change : name', function(){
 		console.log("名前が変わりました。");
	}),
	this.on('change : age', function(){
 		console.log("年齢が変わりました。");
	})
	console.log("初期化処理修了 : " + this.get("name"));
}
});

スクリーンショット 2014-09-27 21.38.35.png

結論

まずは、記述ミス2の スペース有り(後)は、changeチェンジハンドラに対して、スペース + 属性: nameという属性を待ち受けていることになる。当然、そのような属性は存在しないために、そもそもイベントハンドラは呼ばれない。

次に、記述ミス1のスペース有り(前)と、記述ミス3のスペース有り(両方)の挙動は、チェンジ + スペース change :というハンドラを定義していることとなる。しかし、イベントハンドラが全て呼ばれてしまっている。これに関しては、どのような原理でそうなるのか正直わからない。

その挙動の仕組みをアドバイスを頂けたらと思うが、とりあえず記述ミスをしないようにすることを心に留める。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?