-
Notifications
You must be signed in to change notification settings - Fork 11
1.x View
beez.ViewはMVCにおけるViewを担当します。
Backbone.jsのViewを基に作られているので、基本的な機能については Backbone.View を参照してください。
beez.Viewは、Backbone.Viewの薄いラッパーです。Backbone.Viewのすべての機能は、beez.Viewで利用可能です。
Backbone.Viewの機能に加え、beez.manager.viewと連携することで、
- 自動 Dispose
- 表示の切り替え
等の機能を利用することができます。
新しく MyView を定義する際は、beez.View を継承します。
var MyView = beez.View.extend(
'MyView',
{
vidx : 'myView',
tagName : 'div',
events : { },
initialize : function initialize() { },
beforeOnce : function beforeOnce() { },
before : function before() { },
render : function render() { },
after : function after() { },
afterOnce : function afterOnce() { },
conceal : function conceal() { },
remove : function remove() { },
dispose : function dispose() { }
}
);vidx の値は、beez.manager.view のView管理上の index として使用されます。
tagNameはBackbone.Viewの機能のひとつで、MyViewの持つDOM Elementのラッパー要素を示しています。 こちらの詳細は Backbone.View - el を参照してください。
基本的に、View インスタンス生成は beez.manager.view を利用して行います。
beez.manager.view を通した View のインスタンス生成例
beez.manager.view.create('/@', MyView);'/@' 部分は Manager が管理する JSONPath で MyView を追加したい親のPathを指定します。
createしたViewのpathは、prefix + '/' + View#vidx となり、今回の場合、MyView は beez.manager.view で '/@/myView' というPathで管理されます。
View のインスタンス取得は beez.manager.view を利用して行います。
Manager で管理されている View を取得する例
var myView = beez.manager.view.get('/@/myView');MyViewの子としてMyChildViewを生成するには、以下の様にします。
var MyChildView = beez.View.extend(
'MyChildView',
{
vidx : 'myChildView',
tagName : 'div',
events : { },
initialize : function initialize() { },
beforeOnce : function beforeOnce() { },
before : function before() { },
render : function render() { },
after : function after() { },
afterOnce : function afterOnce() { },
conceal : function conceal() { },
remove : function remove() { },
dispose : function dispose() { }
}
);
beez.manager.view.create('/@/myView', MyChildView);これで、beez.manager.view上に「'/@/myView/myChildView'」という階層構造が作られたことになります。
先の例では特に言及せずに「'/@'」というprefixを指定しましたが、この「'/@'」というのはbeez.manager.view内のrootとなる特別なView(※以後、rootとなるViewをRootViewとする)を示します。 RootViewはbeez.managar.viewが管理するView群の最上位Viewを示し、他のViewと比較してshow/hideに影響されない等の違いがあります。 RootViewの定義方法自体は、上記のbeez.Viewを継承する方法と基本的には違いはありませんが、vidxには必ず「'@'」を用いてください。
var RootView = beez.View.extend(
'RootView',
{
vidx : '@',
el : '#w',
events : { },
initialize : function initialize() { },
beforeOnce : function beforeOnce() { },
before : function before() { },
render : function render() { },
after : function after() { },
afterOnce : function afterOnce() { },
conceal : function conceal() { },
remove : function remove() { },
dispose : function dispose() { }
}
);elはBackbone.Viewの機能のひとつで、elプロパティで指定した要素(既に存在する要素)をViewのラッパー要素として使用します。こちらの詳細はBackbone.View - elを参照してください。
RootViewは基本的に不変なViewを示すため、通常はhtmlで定義されたDOM Elementのidを指定することになります。 この場合は既に 「id="w"」となっているDOM Elementが存在することを前提としたコードになっています。
<html>
<head>
<title>test</title>
</head>
<body>
<div id="w"></div>
</body>
</html>rootとなるViewとしてbeez.manager.viewの管理上に置くには、特殊なrootメソッドを使用します。
beez.manager.view.root(RootView);これでRootViewがroot「'/@'」として、beez.manager.viewのView管理上に置かれたことになります。
Backbone.Viewの機能として、担当するDOM要素のイベントをハンドリングすることができます。 eventsプロパティに、
var MyView = beez.View.extend(
'MyView',
{
vidx : 'myView',
tagName : 'div',
events : {
'click .btn' : 'onClick'
},
initialize : function initialize() { },
beforeOnce : function beforeOnce() { },
before : function before() { },
render : function render() {
var str = '<ul>';
str += '<li><a href="#" class="btn">button A</a></li>';
str += '<li><a href="#" class="btn">button B</a></li>';
str += '<li><a href="#" class="btn">button C</a></li>';
str += '</ul>';
this.$el.html(str);
},
after : function after() { },
afterOnce : function afterOnce() { },
onClick : function onClick(e) {
e.preventDefault();
e.stopPropagation();
alert($(e.target).html());
}
}
);の様に、「'eventname [selector]'」と「'methodname'」の対を記述することでDOMイベントをdelegateする仕組みです。 より詳しい情報は、Backbone.View - delegateEventを参照してください。
各Viewの表示/非表示を切り替えるには、async().show() / async().hide()メソッドを使用します。
var myView = beez.manager.view.get('/@/myView');
//表示
myView.async().show().end();
//非表示
myView.async().hide().end();showメソッドが実行されると、Viewインスタンス内のbeforeOnce() → before() → render() → after() → afterOnce()が順に実行され、hideメソッドが実行されると、Viewインスタンス内のconceal() → remove()が順に実行されます。
var MyView = beez.View.extend(
'MyView',
{
vidx : 'myView',
tagName : 'div',
events : { },
initialize : function initialize() { }, //初期化時に実行される
beforeOnce : function beforeOnce() { console.log('1'); }, //初回のみ、beforeが実行される直前に実行される
before : function before() { console.log('2'); }, //renderが実行される直前に実行される
render : function render() { console.log('3'); }, //レンダリング
after : function after() { console.log('4'); }, //renderが実行された直後に実行される
afterOnce : function afterOnce() { console.log('5'); } //初回のみ、afterが実行された直後に実行される,
conceal : function conceal() { console.log('6'); }, // async().hide()が実行された直後に実行される
remove : function remove() { console.log('7');}, // concealが実行された直後に実行される
dispose : function dispose() { console.log('8');} // dispose viewのインスタンスを破棄する際に実行される
}
);特定のViewの表示/非表示を切り替えたい場合、filterオプションを使用します。
関数の戻り値で指定した条件に一致するviewのみを対象に表示/非表示を切り替えます。
View.async().show({
filter: function (view) {
return view.vidx === 'hoge'
}
});Viewインスタンスの表示/非表示切り替えのタイミングでイベントが発火します。
-
beez:view:render→ Viewが表示された後に発火するイベントです -
beez:view:remove→ Viewが非表示になった後に発火するイベントです