4
3

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で、複数のModel間で変数を共有化したい場合

Posted at

Collection の使い道がいまいち思いつかなかったのですが、ようやく使えそう。

まず、ModelBaseという共通クラスを定義して
それを継承するModelを複数個定義。

test.model.coffee
class ModelBase extends Backbone.Model
	defaults: {
		var1: "",
		var2: "",
	}

	urlRoot: ->
		"/js_test"

class TestModelA extends ModelBase
	defaults: ->
		_.defaults {}, _.result ModelBase.prototype, "defaults"

	url: ->
		@urlRoot()

class TestModelB extends ModelBase
	defaults: ->
		_.defaults {}, _.result ModelBase.prototype, "defaults"

	url: ->
		@urlRoot()

Collectionを定義。

test.collection.coffee
class TestCollection extends Backbone.Collection

Viewを定義。

test.view.coffee
class TestView extends Backbone.View
	el: ".container"

	events: {
		"click #setParams": "setParams",
	}

	render: ->
		$("#result").empty()
		for model in @collection.models
			$("#template").tmpl(model.attributes).appendTo("#result")

	setParams: ->
		for model in @collection.models
			model.set {
				"var1":$("#var1").val(),
				"var2":$("#var2").val(),
			}
		@render()

目的は、this.setParams()でTestModelAとTestModelB間で変数を共有すること。
this.render()はおまけです。

Model, View, Collection のインスタンスを生成。

test.default.coffee
mTestA = new TestModelA
mTestB = new TestModelB

cTest = new TestCollection
cTest.add mTestA
cTest.add mTestB

vTest = new TestView collection:cTest

もしレンダリングしたければ、html側で

HTML
<input type="text" id="var1">
<input type="text" id="var2">
<button id="setParams">render</button>

みたいな感じです。

正直、こんな面倒なことをしなくても
_.defaults()や_.extend()をつかえばいいのかな…

4
3
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?