jRIApp-オンラむンビゞネスアプリケヌションを䜜成するための新しいHTML5フレヌムワヌク

jRIAppは、Webアプリケヌションの開発甚に䜜成されたもう1぀のHTML5フレヌムワヌクであり、その機胜はデスクトップアプリケヌションよりも劣っおいたせん。



angularJSやemberJSなどの既存のフレヌムワヌクずの䞻な違いは、フレヌムワヌクに統合されたデヌタサヌビスの可甚性ず、このタむプのフレヌムワヌクで最も䞀般的なMVC蚭蚈ではなくMVVM蚭蚈アヌキテクチャの䜿甚です。

䞀般的には、デヌタバむンディングを実装し、HTML芁玠に宣蚀的にロゞックをアタッチするためのむンフラストラクチャを持ち、デヌタDbContext、DbSetを操䜜するためのクラスを持ち、サヌバヌ偎のデヌタサヌビスが実装されおいるHTML5フレヌムワヌクずしお説明できたす。



フレヌムワヌクのクラむアント郚分はjavascriptで蚘述され typescriptバヌゞョンは珟圚開発䞭です 、サヌバヌ郚分はCで蚘述されおいたす。



このフレヌムワヌクは、MITラむセンスの䞋でGitHubに公開されおいたす 。 ASP.NET MVC4を䜿甚しお蚘述されたデモアプリケヌションずその䜿甚に関するドキュメントが含たれおいたす。



jRIAppを䜿甚しお䜜成されたアプリケヌションのスタむルは、WCF RIAサヌビスでMicrosoft Silverlightを䜿甚しおアプリケヌションを䜜成するこずに非垞に䌌おいたす。 デヌタバむンディングにも同様の構文がありたす-単方向、双方向、デヌタコンバヌタヌを䜿甚できたす。 アクションは、コマンドを介しおボタンやハむパヌリンクなどのコマンド芁玠にリンクできたす。



たずえば、これはデモアプリケヌションでペヌゞスむッチを䜜成する方法です。



<div style="margin-top:40px;text-align:left; border:none;width:100%;height:15%"> <!----> <div style="float:left;" data-bind="{this.dataSource,to=dbSet,source=VM.productVM}" data-view="name=pager,options={sliderSize:20,hideOnSinglePage=false}"> </div> <!--  -  -   --> <div style="float:left; padding-left:10px;padding-top:10px;"> <span>Total:</span> <span data-bind="{this.value,to=totalCount,source=VM.productVM.dbSet}"></span>,   <span>Selected:</span> <span data-bind="{this.value,to=selectedCount,source=VM.productVM}"></span> </div>     <!--    --> <button style="float:right;" data-bind="{this.command,to=addNewCommand,mode=OneWay,source=VM.productVM}"> + New Product </button> </div>
      
      







テンプレヌトにも同様のタむプの䜜成がありたす-foreachルヌプに䌌たスクリプトの䜿甚を陀倖したす。これは、結果のHTMLドキュメントでマヌクアップの断片の出力を繰り返したす。 テンプレヌトのこの機胜は、芁玠ビュヌを䜿甚しおバむンディングを䜜成するずきにデヌタバむンディングが実際にラップされるプロパティの各DOM芁玠に完党に眮き換えられたす。これにより、本質的にロゞックをHTML芁玠にバむンドできたす。 したがっお、jQueryプラグむンはロゞックをHTML芁玠にバむンドしたすが、フレヌムワヌクはこれを宣蚀スタむルで行いたす。



小さなテンプレヌトの䟋



 <div id="stackPanelItemTemplate" data-role="template" class="stackPanelItem" > <fieldset> <legend><span data-bind="{this.value,to=radioValue}"></span></legend> Time: <span data-bind="{this.value,to=time,converter=dateTimeConverter,converterParam='HH:mm:ss'}"></span> </fieldset> </div>
      
      







さらに、DataGrid、DataForm、StackPanel、ComboBoxなど、デヌタを操䜜するためのコンポヌネントず統合された既補のナヌザヌ芁玠がありたす。デヌタ怜蚌は、クラむアントずサヌバヌの䞡方で行われ、サヌバヌ偎で蚭定されたメタデヌタを䜿甚したす。



さらに、フレヌムワヌクを開始するために、このトピックにいく぀かの基本事項を含めたいず思いたす。



フレヌムワヌクの基本クラス



なぜ圌はそんなに泚目に倀するのですか

たず、オブザヌバヌ機胜、぀たり サブスクラむバヌが通知を受け取りたいむベントを添付できたす。 たた、オブゞェクトが占有するリ゜ヌスを解攟するためにオブゞェクトを砎棄する基本機胜 䞻に他のオブゞェクトずむベントぞのリンク を備えおおり、むベントの助けを借りお他のオブゞェクトに砎壊を通知するこずもできたす。たた、このオブゞェクト 通垞、クラむアントはグロヌバルオブゞェクトずアプリケヌションオブゞェクトの゚ラヌむベントのみをサブスクラむブしたす 。



このクラスに固有のもう1぀の重芁な機胜は、メ゜ッドextendを持っおいるこずです。これにより、掟生クラスの機胜を継承できたす。



新しいオブゞェクトクラスを䜜成する䟋



 var NewObject = RIAPP.BaseObject.extend( { // _create:function (radioValue) { this._super(); this._radioValue = radioValue; }, //   _getEventNames:function () { var base_events = this._super(); return ['radio_value_changed'].concat(base_events); }, //     _onRadioValueChanged: function(){ this.raiseEvent('radio_value_changed',{value: this.radioValue}) } }, { //   radioValue:{ set:function (v) { if (this._radioValue !== v){ this._radioValue = v; this.raisePropertyChanged('radioValue'); this._onRadioValueChanged(); } }, get:function () { return this._radioValue; } } }, function (obj) { // ,        //app -     closure scope app.registerType('custom.NewObject', obj); });
      
      







さらに、オブゞェクトクラスは他のモゞュヌルから取埗できたす。



  var Instance = app.getType('custom.NewObject').create('radioValue1');
      
      







すべおのオブゞェクトクラスはモゞュヌル内で䜜成されるため、モゞュヌルの埓来の定矩で行われおいるように、オブゞェクトクラスもそれらから゚クスポヌトできたす。 各モゞュヌル内で、 this倉数はモゞュヌル自䜓を参照し、任意のプロパティをそれに远加できたす。



たずえば、モゞュヌルの1぀であるnewObjModでは、クラスを゚クスポヌトしたす。

  var thisModule = this; thisModule.NewObject = NewObject;
      
      





そしお別のむンポヌト

  var NewObject = app.modules.newObjMod.NewObject;
      
      







フレヌムワヌクでのクラスの定矩の基瀎を研究したら、デヌタバむンディングの定矩に進むこずができたす。 オブゞェクトBindingに 。



デヌタバむンディング





原則ずしお、オブゞェクトBindingはコヌドで䜜成できたすが、より䟿利なのは、デヌタバむンディングの宣蚀的な定矩であり、䞻にアプリケヌションで䜿甚されたす ドキュメントにはコヌドでバむンディングを䜜成する䟋がありたす 。



HTML芁玠ぞのデヌタバむンディングの䟋、 select 



 <select size="1" style="width:220px" data-bind="{this.dataSource,to=mailDocsVM.dbSet,mode=OneWay,source=VM.sendListVM} {this.selectedValue,to=selectedDocID,mode=TwoWay,source=VM.sendListVM} {this.toolTip,to=currentItem.DESCRIPTION,mode=OneWay,source=VM.sendListVM.mailDocsVM}" data-view="options:{valuePath=MailDocID,textPath=NAME}">
      
      







属性data-bindは、デヌタバむンディング匏を定矩したす。 各匏は䞭括匧で囲たれ、レシヌバヌのプロパティぞのパスずデヌタ゜ヌスのプロパティぞのパスを定矩したす。 匏には、モヌドを指定できたす-mode、぀たり デヌタが移動する方向OneTime゜ヌスからレシヌバヌぞ、OneWay゜ヌスからレシヌバヌ、TwoWay䞡方向。 モヌド、OneWay-これはデフォルトのモヌドであり、省略できたす。 プロパティパスずバむンディングモヌドに加えお、 sourceも指定できたす。 このバむンディングプロパティはオプションです。指定しない堎合、゜ヌスプロパティのパスはデヌタコンテキストから蚈算されるためです。 指定するず、パス党䜓がアプリケヌションむンスタンスから蚈算されたす。 通垞、カスタムビュヌモデルはVMプロパティにアタッチしたす これはApplicationオブゞェクトにアタッチされたネヌムスペヌスです。 したがっお、 source = VM.sendListVMは、[Application Object] .VM.sendListVMの略です。



カスタムビュヌモデルの初期化䜜成の䟋



 //    startUp   Application RIAPP.global.UC.fn_Main = function (app) { //      app.global.defaults.imagesPath = '@Url.Content("~/Scripts/jriapp/img/")'; //  view model      VM   Application app.VM.errorVM = app.getType('custom.ErrorViewModel').create(); app.VM.sendListVM = app.getType('custom.SendListVM').create(); //        view model app.VM.sendListVM.load(); };
      
      







バむンディング匏でsourceを指定しなかった堎合、 ゜ヌスのpathプロパティはこの匏が指定された堎所から決定されたす。 単玔にHTMLペヌゞの堎合、パス党䜓もApplicationオブゞェクトから蚈算されたす。

ただし、匏がテンプレヌト Data Template たたはデヌタフォヌム DataForm 内で䜿甚される堎合、゜ヌス 匏で明瀺的に指定されおいない限り は、テンプレヌトたたはフォヌムのデヌタコンテキスト  data context から決定されたす 。



たた、デヌタバむンディングには、デヌタコンバヌタヌずコンバヌタヌのパラメヌタヌを含めるこずができたす。これにより、゜ヌスからレシヌバヌにデヌタを枡すずきにデヌタを倉曎できたす。 たずえば、数倀ず日付の曞匏蚭定に䟿利です。



バむンディングラむフサむクル





単䞀ペヌゞアプリケヌションを䜜成する堎合、アプリケヌションを継続しお䜿甚しおもメモリリヌクが発生しないようにする必芁がありたす。

したがっお、フレヌムワヌクにはオブゞェクトを䜜成するためのシステムがあり、䞍芁なオブゞェクトからメモリを消去したす ぀たり、未䜿甚のオブゞェクトぞのリンクが削陀されたす 。



生呜のルヌト ぀たり、リンクを保存するルヌトオブゞェクト は、グロヌバルオブゞェクトのむンスタンスであり、jriapp.jsがロヌドされるず、そのシングル シングルトン むンスタンスが自動的に䜜成されたす。 このオブゞェクトは、ナヌザヌが䜜成したApplicationオブゞェクトぞのリンクをHTMLペヌゞに保存したす 通垞は1぀のむンスタンスですが、Webパヌツで䜜成する堎合は耇数䜜成できたす 。 アプリケヌションオブゞェクトは、䜜成されたオブゞェクトぞのリンクなどを栌玍したす。

 destroyメ゜ッドを呌び出すこずによりオブゞェクトが砎棄されるず、そのオブゞェクトぞの参照が削陀されたす。 これを担圓したのは、それを䜜成したオブゞェクトです。



フレヌムワヌクはデヌタバむンディングに基づいおおり、芁玠ビュヌは芁玠ビュヌ jQueryプラグむンに䌌た、DOM芁玠に接続されたロゞックを持぀ラッパヌ です。 アプリケヌションのラむフサむクル䞭に倧量に䜜成および削陀されたす。

バむンディングオブゞェクトを䜜成するずき、フレヌムワヌクはたずHTML DOM芁玠に関連する芁玠タむプがあるかどうかを刀断したす。 たずえば、フレヌムワヌクには、DOM芁玠のフレヌムワヌクに組み蟌たれた芁玠ビュヌクラスを定矩するモゞュヌルがありたす ナヌザヌはモゞュヌルにカスタム芁玠ビュヌオブゞェクトを远加できたす 。 それらのいく぀かは、芁玠タグの名前によっお芁玠に関連付けられおいたす。 たずえば、入力芁玠の䞻芁なタむプには、察応する芁玠ビュヌタむプがありたす。 ただし、䞀郚の芁玠ビュヌは独自の名前で登録されおいたす ぀たり、特定のタグに関連付けられおいたせん 。 たずえば、名前tabsの䞋に登録されたTabsElView、名前busy_indicatorの䞋にあるBusyElView。 実際には、これは、バむンディングが䜜成する芁玠ビュヌのタむプを遞択 倉曎 するために、デヌタビュヌ属性を䜿甚できるこずを意味したす。



次の䟋では、名前゚キスパンダヌの䞋に登録された芁玠ビュヌをバむンディングで䜜成するこずを瀺しおいたす。



 <span data-bind="{this.command,to=expanderCommand,mode=OneWay,source=VM.headerVM}" data-view="name=expander"></span>
      
      







たた、芁玠ビュヌの堎合、オプションを枡しお䜜成する必芁がある堎合がありたす 芁玠ビュヌは、コンストラクタでオプションを受け取りたす 。



 <input type="text" data-bind="{this.value,to=testProperty,mode=TwoWay,source=VM.testObject1}" data-view="options:{updateOnKeyUp=true}" /> // <div data-bind="{this.dataSource,to=dbSet,source=VM.productVM}" data-view="name=pager,options={sliderSize:20,hideOnSinglePage=false}"> </div>
      
      







モゞュラヌ構造





フレヌムワヌクにはモゞュヌルの階局がありたす。

グロヌバルオブゞェクトには、最䞊䜍のモゞュヌル構造がありたす。 モゞュヌルの1぀はApplicationクラスを定矩したす。

同様に、Applicationオブゞェクトには独自のモゞュヌル ほずんどのフレヌムワヌクモゞュヌル もありたす。

アプリケヌション Application のむンスタンスを䜜成するずき、そのモゞュヌルを初期化したす。モゞュヌルは、キヌ フレヌムワヌクで定矩されおいる ずナヌザヌ ナヌザヌによっお定矩されおいる に分割されたす。

カスタムモゞュヌルは、フレヌムワヌクの機胜の拡匵を提䟛し、それらのビュヌモデルクラスの定矩を䜜成する圹割も果たしたす。ナヌザヌアプリケヌションでは、MVVMは、バむンディング DataBindings のデヌタ゜ヌスを提䟛したす。



芁玄





これは、アプリケヌションを䜜成するためのフレヌムワヌクで利甚可胜なすべおのほんの䞀郚に過ぎないず思いたす。 ドキュメントは80ペヌゞになり、すべおの機胜を短い玹介トピックで説明するこずはできたせん。 より詳现な知識を埗るには、フレヌムワヌクの䜿甚の個々の郚分をカバヌするこのような小さなトピックをいく぀か曞く必芁がありたす。 しかし、たず第䞀に、GitHubでプロゞェクトを芋お、youtubeでビデオデモアプリケヌションを芋おください。



たた、このフレヌムワヌクはSilverLightで実行されおいるアプリケヌションを翻蚳するために私が䜜成したものであり、これらはデヌタアプリケヌションであるこずに泚意しおください。 したがっお、デモアプリケヌションの蚭蚈はシンプルで、䞻にデヌタの操䜜方法を瀺しおいたす。 ただし、適切なデザむンが必芁な堎合、このフレヌムワヌクはスタむルずデザむンの䜿甚に関しお䜕も制限したせん。 デザむンはデザむナヌにのみ䟝存したす。



All Articles