jsForms

こんばんは、前の投皿を曞いおからおそらく3週間以䞊が経ちたした。それから私の方向性が少し倉わり、MVCは良いパタヌンですが、今ではjsにずっおは面倒です。 私たちは、すべおがどのように機胜するかを芋るこずができる、より透明で埮劙な゜リュヌションを遞択するよう努めおいたす。それがjQueryが奜きな理由です。ブラりザのタむプを無芖できる最小倀を導入したすが、 js。 そのため、jsにDocument-Viewパタヌンを実装しようずするずき、できるだけ埮劙で目に芋えないようにしたかったのですが、同じjsであるずいう同じ軜い感芚を埗るこずができたようです。

WinFormsず同様に、jsFormsではすべおがコンポヌネント䞊に構築されたす。 それでは始めたしょう。



成分

コンポヌネントは2぀の郚分で構成されたす。



芖芚郚分



ビゞュアルパヌツは、HTMLマヌクアップを含み、プロパティずむベントを蚭定するテンプレヌトです。

テンプレヌトは、次の圢匏のjsファむルです。

jsForms.Templates.ComponentType='HTML';









重芁 -HTMLコヌドでは文字「<」および「>」を䜿甚しおタグをフレヌム化し、他の堎所では「lt;」を䜿甚したす およびgt; それに応じお。

HTMLタグは非垞に厳密である必芁がありたす。぀たり、すべおの開いおいるタグを閉じお、順序に埓う必芁がありたす。

テンプレヌトには、ルヌトhtmlタグを1぀だけ含める必芁がありたす。

機胜郚



機胜郚分は、コンポヌネントのプロパティずむベントを宣蚀するだけでなく、「クラス」を含むjsファむルでもありたす。

機胜郚分の圢匏は次のずおりです。

jsForms.Components.ComponentType=<br/>

{<br/>[JavaScript]<br/>};<br/>









jsFormsを䜿甚する



䟋を芋おみたしょう。

たずえば、ボタンのテンプレヌトファむルは次のようになりたす。

jsForms.Templates.Button=' < div class ="button" > '+<br> ' < div class ="button-background" > '+<br> ' < div class ="button-common button-w" /> '+<br> ' < div class ="button-common button-e" /> '+<br> ' </ div > '+<br> ' < span name ="text" class ="button-text" /> '+<br>' </ div > '; <br><br> * This source code was highlighted with Source Code Highlighter .





成分



テンプレヌト内の他のコンポヌネントを䜿甚するには、タグを䜿甚したすコンポヌネント

たた、テンプレヌトに他のコンポヌネントが含たれるコンポヌネントは、コンテナず呌ばれたす。

コンポヌネントタグの圢匏は

< component [ name ='ComponenName' ][ id ='IdValue' ][ class ='CSSClass' ] > [Settings] </ component > <br><br> * This source code was highlighted with Source Code Highlighter .







テキストず2぀のボタンを含むダむアログボックスの䟋を調べおみたしょう。

jsForms.Templates.InsertCSSDialog=' < div > '+<br> ' < div > Test text </ div > '+<br> ' < component type ="Button" /> '+<br> ' < component type ="Button" /> '+<br> ' </ component > '+<br>' </ div > '; <br><br> * This source code was highlighted with Source Code Highlighter .





しかし、質問はボタンの名前をどのように蚭定するのですか

コンポヌネントのプロパティを蚭定するには、プロパティタグを䜿甚したす。

物性



プロパティタグには、コンポヌネントの指定されたすべおのプロパティが含たれ、列挙はキヌタグを䜿甚しお行われたす

キヌタグの圢匏は

< key name ="PropertyName" [ value ="PropertyValue" ][ type ="object|string|int|float..." ][ disable ][ direct ][ const ] > [PropertyValue] </ key > <br> <br> * This source code was highlighted with Source Code Highlighter .









このようにしお、ボタンに「テキスト」を蚭定できたす。

jsForms.Templates.InsertCSSDialog=' < div > '+<br> ' < div > Test text </ div > '+<br> ' < component type ="Button" > '+<br> ' < properties > '+<br> ' < key name ="Text" value ="Ok" /> '+<br> ' </ properties > '+<br> ' </ component > '+<br> ' < component type ="Button" > '+<br> ' < properties > '+<br> ' < key name ="Text" value ="Cancel" /> '+<br> ' </ properties > '+<br> ' </ component > '+<br>' </ div > '; <br><br> * This source code was highlighted with Source Code Highlighter .





次に、ボタンにむベントを添付したす。これには、eventsタグを䜿甚したす

むベント



むベントタグには、指定されたすべおのコンポヌネントむベントが含たれ、列挙はキヌタグを䜿甚しお行われたす

< key name ="EventName" value ="EventCallback" /> <br><br> * This source code was highlighted with Source Code Highlighter .









コンポヌネントの機胜郚分に倉曎を加えるには、bOk_Click、bCancel_Clickの2぀のメ゜ッドを远加したす。

jsForms.Components.InsertCSSDialog=<br>{<br> // <br> // <br> // <br> bOk_Click: function ()<br> {<br> alert( 'OK' );<br> },<br> bCancel_Click: function ()<br> {<br> alert( 'Cancel' );<br> }<br> // <br> // <br> // <br>}; <br><br> * This source code was highlighted with Source Code Highlighter .





テンプレヌトを倉曎したす

jsForms.Templates.InsertCSSDialog=' < div > '+<br> ' < div > Test text </ div > '+<br> ' < component type ="Button" > '+<br> ' < properties > '+<br> ' < key name ="Text" value ="Ok" /> '+<br> ' </ properties > '+<br> ' < events >< key name ="onClick" value ="bOk_Click" /></ events > '+<br> ' </ component > '+<br> ' < component type ="Button" > '+<br> ' < properties > '+<br> ' < key name ="Text" value ="Cancel" /> '+<br> ' </ properties > '+<br> ' < events >< key name ="onClick" value ="bCancel_Click" /></ events > '+<br> ' </ component > '+<br>' </ div > '; <br><br> * This source code was highlighted with Source Code Highlighter .







テンプレヌトにはもう1぀の重芁なプロパティがあり、各HTMLタグずコンポヌネントに名前を付けるこずができたす。

「クラス」で利甚可胜になりたす。 名前を蚭定するには、属性名を蚭定する必芁がありたす。 すべおのコンポヌネント

この属性が蚭定されおいない堎合、コンパむル䞭に「_CX」ずいう圢匏の名前が自動的に生成されたす。Xは数字、

なぜこれが必芁になるのかは埌で明らかになりたす。 コンポヌネントコヌドで名前を䜿甚する方法を以䞋に説明したす。

このテンプレヌトを䜿甚するず、1぀のコンポヌネントを別のコンポヌネントに投資できたす。 たずえば、MultiPanelコンポヌネントを䜜成したしょう。

テンプレヌト

jsForms.Templates.MultiPanel=' < div > '+<br> ' < div class ="MPanelTop" name ="top" /> '+<br> ' < div class ="MPanelCenter" name ="content" /> '+<br> ' < div class ="MPanelBottom" name ="bottom" /> '+<br>' </ div > '; <br><br> * This source code was highlighted with Source Code Highlighter .





「クラス」

jsForms.Components.MultiPanel={};







内容



次に、ダむアログボックスを倉曎したす。キヌをパネルの䞋郚に、テキストを䞊郚に配眮し、入力を䞭倮に远加したす。

jsForms.Templates.InsertCSSDialog=' < div > '+<br> ' < component type ="MultiPanel" > '+<br> ' < content into ="top" > '+<br> ' < div > Please enter css class name </ div > '+<br> ' </ content > '+<br> ' < content > '+<br> ' < input name ="iStyleClassName" /> '+<br> ' </ content > '+<br> ' < content into ="bottom" > '+<br> ' < component type ="Button" > '+<br> ' < properties > '+<br> ' < key name ="Text" value ="Ok" /> '+<br> ' </ properties > '+<br> ' </ component > '+<br> ' < component type ="Button" > '+<br> ' < properties > '+<br> ' < key name ="Text" value ="Cancel" /> '+<br> ' </ properties > '+<br> ' </ component > '+<br> ' </ content > '+<br>' </ div > '; <br><br> * This source code was highlighted with Source Code Highlighter .





䟋からわかるように、contentタグを䜿甚しお、1぀のコンポヌネントを別のコンポヌネント内に配眮できたす。

コンテンツタグの圢匏は

< content [ into ="ComponentName" ] > [HTML|Component] </ content > <br><br> * This source code was highlighted with Source Code Highlighter .









線集





前の投皿からの画像、本質は同じたたでしたが、解析メカニズム自䜓が倉曎されたした。

コンポヌネントの最初の芁求で、゚ンゞンはこのコンポヌネントがコンパむルされおいるかどうかをチェックし、コンパむルされおいない堎合はコンパむルしたす。 これを行うために、圌はテンプレヌトを解析し、それに基づいおjs関数を䜜成したす。

関数を呌び出すず、DOMモデルが䜜成され、jQueryでラップされ、コンポヌネントの「クラス」の基本的な機胜ず機胜がこのオブゞェクトにアタッチされたす。基本は、コンポヌネントコンポヌネントによっお定矩される機胜です。 。

぀たり、コンパむルする堎合

jsForms.Templates.InsertCSSDialog=' < div id ="test" > '+<br> ' < component type ="MultiPanel" > '+<br> ' < content into ="top" > '+<br> ' < div name ="SimpleText" > Please enter css class name </ div > '+<br> ' < div > Unnamed div </ div > '+<br> ' </ content > '+<br> ' < content > '+<br> ' < input name ="iStyleClassName" /> '+<br> ' </ content > '+<br> ' < content into ="bottom" > '+<br> ' < component type ="Button" > '+<br> ' < properties > '+<br> ' < key name ="Text" value ="Ok" /> '+<br> ' </ properties > '+<br> ' </ component > '+<br> ' < component type ="Button" name ="bCancel" > '+<br> ' < properties > '+<br> ' < key name ="Text" value ="Cancel" /> '+<br> ' </ properties > '+<br> ' </ component > '+<br> ' </ content > '+<br>' </ div > '; <br><br> * This source code was highlighted with Source Code Highlighter .





出力では、次を含むオブゞェクトを取埗したす。



たた、コンポヌネント自䜓のDOMオブゞェクトにはオブゞェクトぞの参照が含たれおおり、_OBJプロパティに栌玍されおいるこずを知っおいる必芁がありたす。

document.getElementById 'test'._ OBJ-クラスInsertCSSDialogの特定のオブゞェクトず等しくなりたす。

より単玔なレコヌドの堎合は、jsForms.GetObject芁玠を䜿甚し、特定のタむプのコンポヌネントを怜玢するこずをお勧めしたす

jsForms.GetObjectByType芁玠、foundType

機胜郚分の実装



次に、具䜓的に機胜郚分の蚘述に移りたす。

jQueryで非垞にうたく実装されおいる「チェヌン」アプロヌチを䜿甚するこずをお勧めしたす。このため、各メ゜ッドの最埌に、自身ぞのポむンタヌを返したす[これを返す; ]。

たた、デヌタに特別に割り圓おられた堎所、぀たりthis.P. <PropertyName>を䜿甚しお、プロパティを保存したす。

メ゜ッドずプロパティ名に倧文字を付けたす-これにより、jQueryメ゜ッドが重耇するのを防ぎたすが、ベヌスオブゞェクトがjQueryずそのプラグむンであるこずに泚意しおください。プラグむンのメ゜ッドの名前は倧文字で始たるこずがありたす。あなたは緊匵する

Initメ゜ッドを「オヌバヌロヌド」する堎合、ベヌスクラスぞの呌び出し[return jsForms.Components.Component.Init.callthis;]を最埌に挿入し、ネストされたコンポヌネントを初期化する必芁がありたす。

this.Cプロパティには、タグやテンプレヌトの他のコンポヌネントをラップしお操䜜するjQueryがあるこずに泚意しおください。

ダむアログボックスに怜蚌を远加したしょう。

jsForms.Components.InsertCSSDialog=<br>{ // <br> bOk_Click: function ()<br> {<br> var text = this .C.iStyleClassName.val();<br> if (text==undefined || $.trim(text)== '' )<br> {<br> alert( 'Please enter css class name' );<br> return ;<br> }<br> alert( 'OK, class="' +text+ '");<br> },<br> bCancel_Click:function()<br> {<br> alert(' Cancel');<br> },<br> // <br>}; <br><br> * This source code was highlighted with Source Code Highlighter .





コンポヌネントにプロパティ、むベント、たたはコンテナを远加する堎合は、宣蚀する必芁がありたす。そのため、特別に構成されたオブゞェクトをパラメヌタヌずしお受け取るjsForms.CreateCompileInfoByObjectobjDeclaration関数を呌び出すのが最も簡単です。

objDeclaration={<br>{Name:<ComponentType>,<br> Properties:{ // Property list <br> <PropertyName1>:{ Type:<PropertyType><,Values:{ object }>, Access:<PropertyAccess>,Description:<String>},<br> <PropertyName2>:{ Type:<PropertyType>,Access:<PropertyAccess>},<br> etc<br> }<br> Events:{<br> <EventName1>:{Description:<String>},<br> <EventName2>:{Description:<String>},<br> <EventName3>:{Description:<String>},<br> etc},<br> Contents:<br> {<br> <ContentName1>:{Description:<String>},<br> <ContentName2>:{Description:<String>},<br> <ContentName3>:{Description:<String>},<br> etc}<br> }<br>}; <br><br> * This source code was highlighted with Source Code Highlighter .







PropertyType in 'Boolean'、 'String'、 'Object'、 'Int'、 'Float'、 'Values'、<undefined><undefined>-デフォルトです

PropertyAccess in 'Direct'、 'Set'、 'Get'、 'GetSet' 'GetSet'-デフォルトです

プロパティずむベントを宣蚀するキヌの䟋を芋おみたしょう。

jsForms.Components.Button = {<br> Init: function ()<br> {<br> // <br> // Init, <br> // <br> return this .SetEnabled( true );<br> },<br> eventClick : function (e)<br> {<br> if (e.data) { //e.data <br> if (e.data.P.Enabled) {<br> e.data._ExecEvent( 'onClick' );<br> }<br> }<br> },<br> SetEnabled: function (flag)<br> {<br> if ( this .P.Enabled != flag) {<br> this .P.Enabled = flag== true ;<br> this .attr( 'state' , flag ? 'enabled' : 'disabled' );<br> if (flag) {<br> this .unbind( 'click' ).bind( 'click' , this , this .eventClick );<br> }<br> else {<br> this .unbind( 'click' );<br> }<br> }<br> return this ;<br> },<br> GetEnabled: function ()<br> {<br> return this .P.Enabled;<br> },<br> GetText: function ()<br> {<br> return this .P.text;<br> },<br> SetText: function (newText)<br> {<br> if ( this .P.text != newText) {<br> this .P.text = newText;<br> this .C.text[0].innerHTML = newText;<br> }<br> return this ;<br> }<br>};<br> // ----------------------------------------------- <br> // Compilation INFO <br> // ----------------------------------------------- <br>jsForms.CreateCompileInfoByObject(<br>{<br> Name: 'Button' ,<br> Properties: {<br> Enabled: {<br> Type: 'Boolean' ,<br> Access: 'GETSET' <br> },<br> Text: {}<br> },<br> Events: {<br> onClick: {}<br> }<br>});<br> <br> * This source code was highlighted with Source Code Highlighter .







ペヌゞにコンポヌネントを挿入する



ペヌゞ䞊のコンポヌネントを䜿甚するプロセスに移りたしょう。

コンポヌネントを䜜成するには、jsForms.CreateComponentcompType関数を呌び出す必芁がありたす

var button = jsForms.CreateComponent( 'Button' );<br> // "" , DOM<br/> <br>button.hide().appendTo(...);<br> // DOM , Init() <br/> <br>button.Init().show();<br> // , .<br/> <br> var button = jsForms.CreateComponent( 'Button' ).hide().appendTo(...).Init().show(); <br><br> * This source code was highlighted with Source Code Highlighter .







性胜



パフォヌマンスを枬定するために、2000個の単玔なオブゞェクトが䜜成され、各テストが10回繰り返されたした。

テスト環境

WinXP Sp2、FireFox 3.0.4 + FireBug、CPU Intel Pentium Dual E2160 @ 1.80GHz、2Gb Mem



グラフからわかるように、結果は倉動したす。これはおそらくガベヌゞコレクタヌが原因で、jsの速床が䜎䞋するこずがありたす。

詳现な統蚈



ここでテストできたす 。

远䌞



珟時点では、次のコンポヌネントが実装されおいたす。



このアプロヌチの䜜業の実䟋は、サむト、 コンポヌネント゚ディタヌです。

サむト党䜓ずテクノロゞヌ自䜓はGPL3で利甚できたす。 公匏サむトからダりンロヌドできたす。

この゚ディタヌは開発䞭なので、提案ず批刀に満足したす。

テスト枈みのテクノロゞヌFF2 +、IE7、Safari、Chrome

IE6をお持ちの方は、賌読を停止しおください。事前に感謝したす。

Habrにも感謝したす。倚くのアむデアが圌のペヌゞから即座に取り入れられたからです。

ありがずう






All Articles