Skip to content

Instantly share code, notes, and snippets.

@koron
Created January 29, 2014 05:16
Show Gist options
  • Save koron/8682242 to your computer and use it in GitHub Desktop.
Save koron/8682242 to your computer and use it in GitHub Desktop.
ChaplinでRactiveを使うのに必要なもの、そのサンプル。
class RactiveView extends Chaplin.View
# どの要素にデータを流しこむか指定するセレクタ
el: '#main'
# テンプレート名、getTemplate で使われる
templateName: 'template_empty'
# 変更不可: dipose メソッドを正しくオーバーライドするために必要
keepElement: true
# Backboneのモデルを直接ViewModelとしてRactiveで使うために必須
# その他のオプションは派生クラスで追加すべし。
ractiveOptions: {
adaptors: [ 'Backbone' ]
}
# optionsをプロパティとして捕捉
constructor: (@options={}) ->
super
render: () ->
# Chaplin.Viewのrenderメソッドを完全にオーバーライド
if @disposed
return false
@container = @getContainer()
@template = @getTemplate()
@viewModel = @getViewModel()
@listeners = @getListeners()
@ractive = new Ractive(_.extend({}, @ractiveOptions, {
el: @container
template: @template
data: @viewModel
}))
@ractive.on(@listeners)
dispose: () ->
# Chaplin.Viewのdiposeをほぼオーバーライド
if @disposed
return @
if @ractive
@ractive.teardown()
@ractive = null
@stopListening()
super
getContainer: () ->
return @$el
getTemplate: () ->
# RailsのJSTを使ってテンプレートデータを取り出している
# フレームワークによっては要書き換え
return JST[@templateName](@)
# ViewModel を返す
# 派生クラスでオーバーライドしたほうがよいので、していなかった場合に備えて
# メッセージを表示してる
getViewModel: () ->
console.log('WARN: View#getViewModel must be overriden')
return {}
# Ractiveに登録するイベントリスナを返す
# 派生クラスでオーバーライドしたほうがよいので、していなかった場合に備えて
# メッセージを表示してる
getListeners: () ->
if @options.listeners?
return @options.listeners
console.log('WARN: View#getListeners must be overriden')
return {}
# 自身と子供のViewの更新=再描画を促す
# 本来ならbindingで自動更新されるが、自動更新されないケースというのが多々存在
# する。そのような時に手動更新を行うメソッド。
update: () ->
if @disposed
return
@ractive?.update()
# Propagate update to subviews.
for view in @subviews
view.update?()
class UserView extends RactiveView
# テンプレート名を指定する
templateName: 'template_user'
getViewModel: () ->
return {
# TODO: Add some properties for ViewModel.
}
getListeners: () ->
return {
# TODO: Add event handlers.
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment