一般に、各レベルに別々のコンポーネントを定義し、各コンポーネントにテンプレートを割り当て、expand()
/collapse()
メソッドを実装する必要があります。コンポーネントが最初に折りたたまれている場合は、初期化時に子アイテムをレンダリングする必要はありません。子コンポーネントを展開するときにのみレンダリングします(子コンポーネントの適切なテンプレートが使用されます)。
あなたが仕事をしようとしている基本的なコードを提供してください、そう簡単にあなたを助けるでしょう。
テンプレートを使用する単純なレンダリングフローを備えたウィジェットシステムのクイックプロトタイプです。私はあなたのアプリケーションのような何かをしたいと思います。それは最適化されていません、それはあなたのフレームワークがどのように見えるかのアイデアです。
/**
* Widget constructor
*/
var Widget = function(config) {
// apply config
$.extend(this, config);
// attempt to render
this.render();
};
/**
* Widget prototype
*/
$.extend(Widget.prototype, {
// render target
renderTo: null,
// template
tpl: '<div class="container-panel">' +
'<p>${txt}</p>' +
'<div class="items-container"></div>' +
'</div>',
// template data
tplData: null,
// child items array
children: null,
// initial collapsed state
collapsed: false,
// widget's root element
el: null,
// default render target selector for child items
renderTarget: '.items-container',
render: function() {
var me = this,
renderDom
// render the widget
if(!this.rendered && this.renderTo && this.tpl) {
renderDom = $.tmpl(this.tpl, this.tplData);
// assume that first element is widget's root element
this.el = renderDom[0];
$(this.renderTo).append(renderDom);
// clear the reference
renderDom = undefined;
// THIS IS JUST EXAMPLE CODE! Bind click handler...
$(this.el).find('p').first().click(function() {
me.collapsed ? me.expand() : me.collapse();
});
// find render target for children
this.renderTarget = $(this.el).find(this.renderTarget).first();
// render children if not collapsed
this.renderChildren();
// set rendered flag
this.rendered = true;
}
},
renderChildren: function() {
var children = this.children;
if(!this.collapsed && children && children.length) {
for(var i = 0, len = children.length; i < len; i++) {
// render children inside
children[i].renderTo = this.renderTarget;
children[i].render();
}
}
},
/**
* Expand template method. Override it.
*/
expand: function() {
this.collapsed = false;
this.renderChildren();
this.renderTarget.show();
},
/**
* Collapse template method. Override it.
*/
collapse: function() {
this.collapsed = true;
this.renderTarget.hide();
}
});
ここではテンプレートを事前に定義し、ウィジェットの最初の段落要素内のクリックで発生する拡大/折りたたみロジックをハードコードしました。
// Using our widgets
var containerPanel = new Widget({
tplData: {txt: 'Hello world!'},
renderTo: $('body'),
collapsed: true,
children: [
new Widget({
tplData: {txt: ' Child 1'},
collapsed: true,
children: [
new Widget({
tplData: {txt: ' Child 1.1'}
}),
new Widget({
tplData: {txt: ' Child 1.2'}
}),
new Widget({
tplData: {txt: ' Child 1.3'}
})
]
}),
new Widget({
tplData: {txt: ' Child 2'}
})
]
});
あなたはjsFiddleでライブの例を見ることができます::http://jsfiddle.net/dipish/XDmWq/ ちょうど項目をクリックすると、動的に生成されるマークアップを見て
これは、あなたがウィジェットを使用する方法です。
私は、コードは自明だと思いますが、ご質問をお気軽に。コードはjQuery Templates Pluginを使用していますが、便宜上のものです。
ウェブアプリケーションに複雑なコンポーネントがたくさんある場合は、ExtJSやDojo Toolkitのような裸のjQueryよりも深刻なものを使用することができます。このようなフレームワークは、通常、便利なクラスシステムと、他の多くのものの上に構築するための基本ウィジェット/コンポーネントロジックを提供します。
幸運を祈る!
チェックアウト私の更新の答え... –
単に素晴らしい.. !!!再度、感謝します.. –