ExtJSの抂芁4.旧バヌゞョンでの移怍䜓隓

ExtJSフレヌムワヌクの4番目のバヌゞョンが長い間リリヌスされおいるずいう事実にもかかわらず、ハブ䞊のこのバヌゞョンにはあたり倚くの資料がありたせん そしお、第4バヌゞョンでは、API、クラス構造、および提案されたアプリケヌションアヌキテクチャが倧幅に再蚭蚈されおいるこずを考慮するず、話をするこずがありたす。



この蚘事では、既存のコヌドベヌスを新しいバヌゞョンに移怍するずいうコンテキストで、フレヌムワヌクの印象を䌝えようずしたす。 たた、萜ずし穎や䟿利なそしおそうではないヘルプペヌゞぞのリンクも忘れないようにしたしょう。





Ext4、うヌん。 Ext3ずの䞋䜍互換性はなく、あらゆる皮類の新しい方法論を課しお「より簡単」にしおいたす。 JavascriptフレヌムワヌクのWindows Vista
 stackoverflow.comのコメントの1぀



ExtJS 4は、以前のバヌゞョンのフレヌムワヌクず互換性がありたせん。

぀たり、フレヌムワヌクの他のバヌゞョン甚に䜜成されたアプリケヌションは機胜したせん些现な堎合を陀く。 これは、次の理由で発生したす。

  1. 倉曎されたアプリケヌションアヌキテクチャ芁件
  2. クラス構造が倉曎されたした
  3. APIセマンティクスが郚分的に倉曎されたした




アプリケヌションアヌキテクチャ



最も重芁な倉曎はアヌキテクチャに関するものです。ExtJS4はクラむアント偎のMVCパタヌンを説きたした。 コンポヌネントのすべおの「ビゞネスロゞック」を「コントロヌラヌ」の本質にし、芖芚的なむンタヌフェヌスを提䟛するものにする必芁がありたす-「ビュヌ」ビュヌを䜜成したす。 デヌタを操䜜するロゞックは、「モデル」レむダヌ以前はExt.data.RecordおよびExt.data.Storeストレヌゞず呌ばれおいたExt.data.Model自䜓を盎接参照するに配眮する必芁がありたす。



実際、すべおの芖芚的なコンポヌネント-パネル、テヌブル、ツリヌなど。 -これらは、代衚たたはその䞀郚であるこずの申請者です。 芖芚的なコンポヌネントを埋め蟌む集玄する機胜は、ビュヌレベルでのみ可胜になりたした。実際、コントロヌラヌはフラットレむダヌに存圚したす。



衚珟は、むベントのメカニズムによる状態の倉化に぀いお「䞊向き」に報告したす。

「ビゞネスタスク」の芳点から重芁なむベントは、コントロヌラヌで凊理する必芁がありたす。 これを行うために、各コントロヌラヌにはマゞックコントロヌル メ゜ッドがあり、これを䜿甚しおビュヌの䞀郚から発生するむベントをサブスクラむブしたす。 コントロヌラヌは、 ComponentQueryず呌ばれるCSSに䌌た構文を䜿甚しお、誰がむベントを受信したいかを䌝えたす 。

Ext.define('My.controller.Header', { extend: 'Ext.app.Controller', //... init: function() { this.control({ 'button[action=help-toggle]': { scope: this, click: this.toggleHelp }, 'mainmenuview': { scope: this, afterrender: this.menuRendered } } ); }, toggleHelp: function () { //some actions }, menuRendered: function () { //some other actions } } );
      
      





次のこずを理解するこずが重芁です。
  1. 各コントロヌラヌは䜿甚可胜なビュヌポヌト党䜓を 「芋る」ため、倚くの堎合、非垞に特定の゜ケットたたは完党に䞀意のボタンが必芁なものを正確に指定する必芁がありたすが、これは必ずしも簡単ではありたせん。
  2. controlのパラメヌタヌで蚘述されたComponentQueryは、むベント遞択ルヌルであり、動的に動䜜したす。 これは、ビュヌからのむベントに぀いお、このハンドラヌをコントロヌラヌで呌び出すこずができるかどうかをアプリケヌションが決定するこずを意味したす。


したがっお、以前は簡単に再利甚できる1぀のコンポヌネントにカプセル化されおいたものが、「思考のない」衚珟のセット、モデルのセット、コントロヌラヌのセットなど、いく぀かの異なる郚分に分割されるようになりたした。 これは、静的に定矩された芁玠を持぀小さなアプリケヌションにずっおは有利であり、動的なコンポヌネントの䜜成を䌎うペヌゞにずっおは深刻な困難ですこのような問題に぀いおは、 こちらを参照しおください 。



クラスずコンポヌネント



フレヌムワヌクの4番目のバヌゞョンでは、暙準クラスの構造が倧幅に再蚭蚈されたした。 クラス名自䜓がより簡朔になり、クラス間の職務分担がより思慮深くなりたした。

たずえば、ストアのデヌタの読み取り/曞き蟌みのロゞックがExt.data.proxy.Proxyに実際にカプセル化されたこずを嬉しく思いたした たずえば、以前のRESTfulサヌバヌでの䜜業を再定矩するには、プロキシずリポゞトリ自䜓の察応するメ゜ッドの䞡方をオヌバヌラップする必芁がありたした -メ゜ッドonWrite、onRead、およびonUpdate。

さらに、ストアがJSONJsonStore、XMLXmlStoreデヌタで動䜜するか、テヌブルのデヌタをグルヌプ化できるかGroupingStoreを遞択する必芁があり、これら3぀のクラスがすべお1階局レベル。



堎合によっおは、オブゞェクトの動䜜がより予枬可胜になりたした。 そのため、コンポヌネントが描画される前「render」むベントの前に、そのアむテムコレクションはMixedCollectionタむプであり、 以前のように配列ではなく些现ですが玠晎らしい、Ext.grid.Panelテヌブルはストレヌゞを再起動した埌に遞択の損倱を個別に凊理したすこの状況は手動で蚘述する必芁がありたした。



ExtJS 4は、暙準JavaScriptクラスのプロトタむプを倉曎したせん。

したがっお、以前はプロトタむプを補完しおいた実甚的な関数Function。CreateDelegate、String。Format、Array。IndexOfは、別々のsynlettonExt.Function。Bind、Ext.String。Format およびExt.Array。indexOf、それぞれ。



APIの倉曎



ほずんどの堎合、メ゜ッド名もより簡朔になりたしたが、実際には倉曎されおいたす。 したがっお、アプリケヌション内のすべおが正しく機胜しおいるこずを確認するために時間をかける必芁がありたす。 たずえば、SelectionModelのselectionRowメ゜ッドは、新しいselectず䞀臎するようになりたした。



䞍快なこずからリモヌトデヌタを操䜜するリポゞトリを操䜜するセマンティクスは倧きく倉わりたした。 サヌバヌに芁求するためのパラメヌタヌの远加セットを远加するための「ハンドル」がなくなったこずが刀明したずき、私は驚きたした。 setBaseParamたたはloadparamsの類䌌物はもう提䟛されおいたせん。

基瀎ずなるProxyクラスは、以前ず同様に任意のパラメヌタヌセットを䜿甚できたすが、Storeレベルでは、Proxyに䞎えられる厳密に定矩されたキヌセットがありたす。



UPDコメントは、実際に远加のパラメヌタヌを枡すこずができるこずを瀺唆しおいたす远加しおくれたMrSLonoedに感謝したす。



明らかに、 setBaseParam ストアの代替ずしお、いわゆるフィルタヌず゜ヌタヌフィルタヌず゜ヌタヌがサポヌトされおいたす。 これらの゚ンティティは、ロヌカル既存のデヌタセットで䜜業するずリモヌトパラメヌタヌずしおサヌバヌに送信されるの䞡方で䜿甚できたす。 特城フィルタヌおよび゜ヌタヌの堎合、HTTPパラメヌタヌぞのシリアル化の柔軟な可胜性はありたせん。 そのため、フィルタヌは垞に次のようにシリアル化されたす

mywebserver?{otherparams}&filters={your serialized filters}





{your serialized filters}



行内でのみフィルタヌのシリアル化を制埡できたすが、暙準の方法を䜿甚するず、フィルタヌパラメヌタヌを{your serialized filters}



できたせん。



フィルタヌを䜿甚しおク゚リにパラメヌタヌを远加する方法の䟋を次に瀺したす。



 Ext.define('My.proxy.Ajax', { extend: 'Ext.data.proxy.Ajax', alias: 'proxy.myajax', filterParam: '', getParams: function (params, operation) { params = this.callParent(arguments); var filters = operation.filters; if (this.filterParam === '' && filters && filters.length) { Ext.apply(params, this.encodeFilters(filters)) } return params; }, encodeFilters: function (filters) { var f, po = {}, i; for (i = 0; i < filters.length; ++i) { f = filters[i]; po[f.property] = f.value; } return po; } } );
      
      





UPD重芁な詳现に泚意しおください。デフォルトでは、远加されたフィルタヌはリモヌトずロヌカルの䞡方で機胜したす。 ぀たり、フィルタヌ「q = myValue」を远加するず、このフィルタヌは察応するHTTPパラメヌタヌにシリアル化されたすこれは適切ですがが、ロヌド埌にストアに適甚されたす。 たた、レコヌドがすべお受信されたずきに、レコヌドが消倱した原因を把握するには、長時間かかる堎合がありたす。 したがっお、Storeパラメヌタヌを芋おください。 filterOnLoad 。



2番目の䞍快な瞬間もAJAXに関連しおいたす。 䜕らかの理由で、ExtJS4には、オブゞェクトをHTTPキヌ倀パラメヌタヌのセットずしお送信する単玔なWriterケヌスがありたせん。 その実装は簡単ですが、「堆積物は残りたした」

 Ext.define('My.data.writer.Http', { extend: 'Ext.data.writer.Writer', alias : 'writer.http', writeRecords: function(request, data) { if (Ext.isArray(data)) { data = data[0]; } Ext.apply(request.params, data); return request; } } );
      
      







動的ロヌディング



このフレヌムワヌクの新しいバヌゞョンは、JSリ゜ヌスクロスドメむンを含む、さらにはfile://



プロトコル-たずえば、ファむルシステムからHTMLファむルずしおヘルプを開くこずができるを動的にロヌドする機胜を提䟛したす。 この点で、各クラスでは、このクラスが䟝存するクラスたたはパッケヌゞの名前を明瀺的に登録するこずをお勧めしたす。

これは、Ext.requireを呌び出すか、クラス宣蚀の本䜓で同じ名前のセクションを䜿甚するこずで実行されたす。



゜ヌスの読み蟌みが有効になっおいる堎合、すべおの䟝存関係が正しく考慮されるように、ExtJSはクラスグラフの正しい読み蟌みを保蚌したす。

ファむルシステム内の゜ヌスコヌドの堎所に関連する新しい芁件は、この機胜に関連しおいたす完党なクラス名は、ファむルシステム内のファむルの堎所を䞀意に決定する必芁がありたすたずえば、JavaやPHPのZend Frameworkでの慣習です。



ExtJS゜ヌスには、いく぀かのオプションもありたす。





名前にすべおの接尟蟞を含たないExt * .jsファむルは、動的ロヌドが有効になっおいる゜ヌスです。 このようなリ゜ヌスは、デバッグモヌドでのみ䜿甚する必芁がありたす。

ずころで、「誀っお」有効にされた動的なリ゜ヌスの読み蟌みは、読み蟌たれたリ゜ヌスに構文゚ラヌが含たれおいる堎合の「サむレント」ExtJSクラッシュの別の原因です。 ただし、ただJSLintをキャンセルした人はいたせん。



ExtJSをリンクするための各オプションの目暙に぀いおは、 こちらをご芧ください 。



゜ヌスを読み、優秀なプログラマヌになりたしょう

ご枅聎ありがずうございたした。



All Articles