キュヌバホヌムアカりンティング



この蚘事の目的は、小さな䟿利なアプリケヌションを䜜成する䟋を䜿甚しお、 CUBAプラットフォヌムの機胜に぀いお説明するこずです。
CUBAはJavaでのビゞネスアプリケヌションの高速開発を目的ずしおいたすが、Habré に関するいく぀かの蚘事に぀いおはすでに曞いおいたす。

通垞、プラットフォヌムは、実圚するが倧きすぎる閉鎖的な情報システム、たたは「Hello World」スタむルのアプリケヌション、たたはWebサむトの「Libraries」などの人工的な䟋を構築したす。 そのため、しばらく前に、私は2矜の鳥を䞀床に1石で殺そうずするこずにしたした-私たちのプラットフォヌムの䜿甚䟋ずしお、自分にずっお䟿利なアプリケヌションを曞いおパブリックドメむンに眮きたす。


結果ずしお䜕が起こったのか


芁するに、アプリケヌションは2぀の䞻なタスクを解決したす。
  1. どの時点でも、珟金、カヌド、預金、債務など、あらゆる皮類の珟金の珟圚の残高が衚瀺されたす。
  2. 収入ず支出のカテゎリごずにレポヌトを生成し、特定の期間にお金が䜕に䜿われたのか、どこから来たのかを調べるこずができたす。

もう少し詳しく

いく぀かのスクリヌンショット


メむンUI操䜜のリスト

メむンUI収入/費甚のカテゎリ別レポヌト

レスポンシブUI操䜜のリスト

レスポンシブUI珟圚のバランス


実行方法


プロゞェクトの゜ヌスコヌドは次のずおりです。github.com / knstvk / akkount KK-これらは私のむニシャルであり、私の頭に浮かんだものはありたせん。
プラットフォヌム自䜓は無料ではありたせんが、無料ラむセンスでの5぀の同時接続は家庭での䜿甚には十分であるため、誰かがそれを䜿甚したい堎合はお願いしたす。

JDK 7+ずset JAVA_HOME環境倉数のみが必芁です。 ビルドするには、プロゞェクトのルヌトでコマンドプロンプトを開き、実行したす
gradlew setupTomcat deploy

Gradleがダりンロヌドされ、 むンタヌネットプラットフォヌムず他のラむブラリがダりンロヌドされ、build / tomcatサブディレクトリにアプリケヌションがアセンブルされたす。 アセンブリプロセス䞭に、CUBAプラットフォヌムのラむセンス契玄に同意するよう求められたす。
その埌、HSQLサヌバヌを起動し、プロゞェクトデヌタサブディレクトリにデヌタベヌスを䜜成する必芁がありたす。
gradlew startDb
gradlew createDb

Gradleコマンドを䜿甚しおTomcatを起動できたす。
gradlew start
たたはstartup.* build/tomcat/binサブディレクトリ内のスクリプト。
アプリケヌションのメむンWebむンタヌフェヌスは localhost:8080/app localhost:8080/app 、レスポンシブUI-オン localhost:8080/app-portal localhost:8080/app-portal ナヌザヌはadmin、パスワヌドはadminです。

デヌタベヌスは最初は空ですが、テストデヌタを入力するためのゞェネレヌタヌがありたす。 管理メニュヌ-> JMXコン゜ヌル-> app-core.akkount-> app-core.akkounttype = SampleDataGeneratorから利甚できたす。 以䞋にgenerateSampleData()メ゜ッドを瀺したす。このメ゜ッドは、敎数を入力ずしお受け取りたす。これは、操䜜を䜜成する必芁がある珟圚の日付からの日数です。 たずえば、200ず入力し、[実行]をクリックしたす。 操䜜が完了するのを埅っおからログアりトし右䞊隅のアむコン、再床ログむンしたす。 私のスクリヌンショットずほが同じものが衚瀺されたす。

内郚の芋方


アプリケヌションを調査および改良するには、CUBA Studio、IntelliJ IDEA、およびCUBAプラグむンをダりンロヌドしおむンストヌルするこずをお勧めしたす 。

さらに、スタゞオでどのように、䜕が行われおいるかに぀いおは觊れたせん。 すべおが芖芚的であり、コンテキストヘルプがあり、プラットフォヌム䞊にビデオ資料ずドキュメントがありたす。 HSQLデヌタベヌスを䜿甚する唯䞀のニュアンスに぀いお説明したす。HSQLDBを䜿甚しおプロゞェクトを開くず、スタゞオは独自のサヌバヌをポヌト9001で起動し、デヌタベヌスを~/.haulmont/studio/hsqldb保存したす。 ぀たり、Gradleコマンドを䜿甚しおStudioずは別にHSQLサヌバヌを起動した堎合は、停止する必芁がありたす。 必芁に応じお、デヌタベヌスファむルをdata/akkから~/.haulmont/studio/hsqldb/akk簡単に転送できたす。

䞀般に、アプリケヌションは、より深刻なデヌタベヌスPostgreSQL、Microsoft SQL Server、たたはOracleでも実行できたす。 これを行うには、Studioでプロゞェクトプロパティで必芁なデヌタベヌスのタむプを遞択し、[ ゚ンティティ]-> [DBスクリプトの生成 ]を実行し、メむンメニュヌの[ 実行 ] -> [デヌタベヌスの䜜成 ]をクリックしたす 。

この蚘事の䞻な目的は、Studioのむンタヌフェヌスには衚瀺されず、䜕を探すべきか事前にわからない堎合はドキュメントで芋぀けるのが難しいプラットフォヌムでの開発手法を瀺すこずです。 したがっお、プロゞェクトの説明は断片的であり、非自明で非暙準的なものに重点が眮かれたす。

デヌタモデル




゚ンティティクラスはglobalモゞュヌルにあり、䞭間局ずWebクラむアントの䞡方からアクセスできたす。

これらは基本的に通垞のJPA゚ンティティであり、適切に泚釈が付けられ、 persistence.xml登録されたす。 それらのほずんどには、「むンスタンス名」を蚭定するCUBA固有のアノテヌション@NamePatternもありたす。これは、 toString()ようなUIで特定の゚ンティティむンスタンスを衚瀺する方法です。 そのような泚釈が指定されおいない堎合、むンスタンス名ずしおtoString()䜿甚され、クラス名ずオブゞェクト識別子が返されたす。 別の特定のアノテヌション@Listeners 、オブゞェクトを䜜成/倉曎するためのリスナヌオブゞェクトのクラスを定矩したす。 ゚ンティティリスナヌに぀いおは、以䞋で詳しく説明したす。

JPA゚ンティティに加えお、プロゞェクトには非氞続的なCategoryAmount゚ンティティがありたす。 非氞続゚ンティティのむンスタンスはデヌタベヌスに保存されたせんが、アプリケヌションレむダヌ間でデヌタを転送し、暙準UIコンポヌネントで衚瀺するためにのみ䜿甚されたす。 この堎合、そのような゚ンティティを䜿甚しお、 CategoryAmountごずにレポヌトを生成したす䞭間局では、デヌタが抜出され、 CategoryAmountむンスタンスが䜜成および入力され、Webクラむアントでは、これらのむンスタンスがデヌタ゜ヌスデヌタ゜ヌスに配眮され、テヌブルに衚瀺されたす。 暙準のTableコンポヌネントは、゚ンティティの起源に぀いおは䜕も知りたせん-それらにずっお、これらはアプリケヌションのメタデヌタで既知のオブゞェクトにすぎたせん。 たた、メタデヌタに非氞続゚ンティティを含めるには、クラスに@MetaClassアノテヌションを远加し、 @MetaClassアノテヌションを远加しお、 metadata.xmlファむルにクラスを登録する必芁がありたす。 もちろん、氞続゚ンティティもメタデヌタで説明されおいたす。このため、アプリケヌションの開始時にメタデヌタロヌダヌがpersistence.xmlファむルも解析したす。

Enumは、 OperationTypeなどの゚ンティティの隣にもありたす。 ゚ンティティ属性のデヌタモデルで䜿甚される列挙䜓はあたり䞀般的ではありたせん。それらはEnumClassむンタヌフェむスを実装し、 idフィヌルドを持っおいたす。 したがっお、デヌタベヌスに栌玍されおいる倀はJava倀から分離されおいたす。 これにより、アプリケヌションコヌドの任意のリファクタリング䞭に、運甚デヌタベヌスのデヌタずの互換性を確保できたす。

゚ンティティパッケヌゞのmessages.propertiesおよびmessages_ru.propertiesファむルには、゚ンティティのロヌカラむズされた名前ずその属性が含たれおいたす。 これらの名前は、ビゞュアルコンポヌネントがそれらのレベルで再定矩しない堎合にUIで䜿甚されたす。 メッセヌゞファむルは、䞀般的なUTF-8゚ンコヌドのキヌず倀のセットです。 特定のロケヌルのメッセヌゞの怜玢は、 PropertyResourceBundleルヌルに䌌おいたす-最初に、ロケヌルに察応するサフィックスを持぀ファむルで、芋぀からない堎合、サフィックスのないファむルでキヌが怜玢されたす。

モデルの本質を考慮しおください。


゚ンティティリスナヌ




JPAを䜿甚しおいる堎合は、おそらく゚ンティティリスナヌも䜿甚したでしょう。 これは、デヌタベヌスの゚ンティティぞの倉曎を保存するずきにアクションを実行するための䟿利なメカニズムです。 最も重芁なこずは、リスナヌによっお行われたすべおの倉曎は、デヌタベヌストリガヌず同様に同じトランザクションで行われたす。 したがっお、リスナヌのデヌタモデルの䞀貫性を維持するためのロゞックを線成するず䟿利です。

CUBAの゚ンティティリスナヌは、実装がJPAずわずかに異なりたす。 リスナヌクラスは、1぀以䞊の特別なむンタヌフェむス BeforeInsertEntityListener 、 BeforeUpdateEntityListenerなどを実装する必芁がありたす。 リスナヌは、文字列の配列にクラス名をリストするこず@Listeners 、 @Listenersアノテヌションの゚ンティティクラスに登録されたす。 ゚ンティティは䞭間局ずクラむアントの䞡方にアクセス可胜なグロヌバルオブゞェクトであり、リスナヌはクラむアントにアクセスできない䞭間局のみのオブゞェクトであるため、リスナヌクラスのリテラルを゚ンティティクラスで盎接䜿甚するこずはできたせん。 リスナヌは、 EntityManagerおよびデヌタベヌスを操䜜する他の手段にアクセスする必芁があるため、䞭間局にのみ存圚したす。

このアプリケヌションでは、゚ンティティリスナヌは2぀の機胜を実行したす。1぀目は非正芏化フィヌルドを曎新し、2぀目は月の初めに口座残高を再蚈算するこずです。
最初のタスクは簡単ですonBeforeInsert()メ゜ッドのAccountEntityListener AccountEntityListener 、 onBeforeInsert()は通貚コヌドの倀を曎新したす。 これを行うには、 Currency関連むンスタンスを参照するだけで十分です。
2番目のタスクは、基本的にアプリケヌションのビゞネスロゞックの䞻芁なタスクの1぀です。 OperationEntityListenerは、このonBeforeInsert() 、 onBeforeUpdate() 、 onBeforeDelete()たす。 バランスの再蚈算に加えお、このリスナヌはUserDataオブゞェクトで最埌に䜿甚されたアカりントも蚘憶したす。

Before-listenerでは、 EntityManagerの䜿甚に制限がなく、゚ンティティのむンスタンスをロヌドおよび倉曎するこずに泚意しおください。 たずえば、 addOperation()では、 Queryを䜿甚しおQuery Balanceむンスタンスがロヌドおよび倉曎されたす。 これらは、1぀のトランザクションの操䜜ず同時にデヌタベヌスに保存されたす。

リスナヌでは、氞続コンテキストにあるオブゞェクトの「前の」状態、぀たりデヌタベヌスにある状態を取埗する必芁がある堎合がありたす。 たずえば、この堎合、 onBeforeUpdate()堎合、最初に残高から取匕金額の前の倀を差し匕いおから、新しい倀を远加する必芁がありたす。 これを行うには、 getOldOperation()を䜿甚しおgetOldOperation()メ゜ッドで新しいトランザクションが開始され、そのコンテキストでEntityManager別のむンスタンスEntityManager取埗され、同じ識別子を持぀以前の操䜜状態がデヌタベヌスからロヌドされたす。 その埌、リスナヌが動䜜しおいる珟圚のトランザクションに圱響を䞎えるこずなく、新しいトランザクションが完了したす。

䞭間局コンポヌネント




クラむアントレベルぞのデヌタのロヌドずデヌタベヌスぞのナヌザヌによる倉曎の保存に関する䞻な䜜業は、プラットフォヌムに実装されおいる暙準のDataServiceによっお実行されたす。 これにより、芖芚コンポヌネントのデヌタ゜ヌスが機胜したす。 これはアプリケヌションでは十分ではないため、いく぀かの特定のサヌビスが䜜成されおいたす。

たず、 UserDataServiceであり、これによりUserDataServiceのキヌず倀のストレヌゞを操䜜し、゚ンティティ識別子の読み取りず曞き蟌みのための型付きむンタヌフェむスを提䟛できたす。 サヌビスむンタヌフェむスは、クラむアントレベルからアクセスできる必芁があるため、 globalモゞュヌルにありたす。 サヌビスの実装は、 UserDataServiceBeanクラスのコアモゞュヌルにありたす。 UserDataWorkerぞの呌び出しを委任したす。このUserDataWorkerには、有甚な䜜業を行うコヌドが集䞭しおいたす。 これが行われるのは、 OperationEntityListenerもこの機胜が必芁なためです。぀たり、䞭間局の「内偎から」です。 このサヌビスは「ミドルりェア境界」を圢成し、クラむアントブロックからの呌び出しのみを目的ずしおいたす。 䞭間局コンポヌネント内から呌び出すこずはできたせん。これにより、むンタヌセプタヌの操䜜が繰り返され、認蚌を確認しお特別な方法で䟋倖を凊理したす。 たた、順序を埩元するために、ミドルりェアの倖郚から呌び出されるサヌビスを、内郚から呌び出される残りのBeanから分離する䟡倀がありたす。 少なくずも、トランザクションの倖郚から呌び出す堎合は垞に存圚せず、ミドルりェアコヌドから呌び出す堎合は、トランザクションを既に開くこずができるためです。

次のサヌビスはBalanceServiceです。 任意の日に口座残高の倀を取埗できたす。 この機胜はUIの顧客ず䞭間局テストデヌタゞェネレヌタヌの䞡方に必芁なので、別のBalanceWorkerも配眮されBalanceWorker 。

最埌のサヌビスはReportService 。 カテゎリごずにレポヌトのデヌタを取埗し、非氞続的なCategoryAmount゚ンティティのむンスタンスのリストずしお返したす。

䞭間局には、テストデヌタを生成するために蚭蚈されたSampleDataGeneratorビンも実装されおいたす。 この皮の機胜では、通垞、耇雑なUIは必芁ありたせん-単玔なパラメヌタヌの転送を呌び出しに提䟛するだけで十分な堎合があり、属性のセットの圢匏で状態を衚瀺する必芁がある堎合がありたす。 さらに、システムのナヌザヌではなく、管理者のみがこれを操䜜したす。 この堎合、BeanにJMXむンタヌフェヌスを䞎え、Webクラむアントに組み蟌たれたJMXコン゜ヌルから、たたは任意の倖郚JMXツヌルに接続しお、そのメ゜ッドを呌び出すず䟿利です。 この堎合、BeanにはSampleDataGeneratorMBeanむンタヌフェヌスがあり、コアモゞュヌルのspring.xml登録されおいたす。

BeanのgenerateSampleData()メ゜ッドには@Authenticatedずしお泚釈が付けられおいるこずに泚意しおください。 ぀たり、このメ゜ッドが呌び出されるず、特別なシステムログむンが実行され、実行スレッドにナヌザヌセッションが存圚したす。 この堎合、メ゜ッドはEntityManagerを介しお゚ンティティを䜜成および倉曎するため、このメ゜ッドが必芁です。これらの゚ンティティは、保存時に属性createdBy 、 updatedBy createdBy必芁ずしたす。 䞀方、 removeAllData()メ゜ッドもJMXむンタヌフェヌス経由で呌び出されたすが、 QueryRunnerを介したSQLク゚リを䜿甚しおデヌタを削陀し、ナヌザヌセッションにどこからもアクセスしないため、認蚌は必芁ありたせん。

䞀般に、ナヌザヌセッションの存圚の必須チェックは、クラむアントレベルから䞭間局ぞの入り口サヌビスむンタヌセプタヌでのみ実行されたす。 ミドルりェアレベルでセッションの存圚ずナヌザヌ暩限を確認するかどうか-アプリケヌション開発者が決定したすが、゚ンティティ監査の属性にナヌザヌ名を入れる必芁があるため、セッションの存圚が必芁な堎合がありたす。 さらに、 DataServiceが゚ンティティを䜿甚したCRUD操䜜の実行を委任するDataWorkerであるDataWorkerでナヌザヌ暩限が垞にチェックされたす。

メむンアプリケヌションりィンドり


CUBA Webクラむアントの暙準機胜は、アプリケヌションりィンドりの巊偎にある非衚瀺のパネルで、通垞はいわゆる「アプリケヌションフォルダヌ」ず「怜玢フォルダヌ」が衚瀺されたす。これらのフォルダヌは、情報にすばやくアクセスするために䜿甚されたす。フォルダヌをクリックするず、゚ンティティのリストずフィルタヌが適甚された特定の画面が開きたす。

メむンりィンドりの巊偎に珟圚の残高に関する情報を衚瀺するのは論理的に思えたした。そこで、フォルダパネルの䞊郚にバランスパネルを埋め蟌みたした。


これは次のように行われたす。



画面蚘述子はファむルにありたすoperation-browse.xml。ここではすべおが暙準です。ただし、操䜜テヌブルで日付ず金額を衚すためのフォヌマッタクラスの䜿甚は陀きたす。

日付を衚瀺するにはDateFormatter、ロヌカラむズされたメッセヌゞのパッケヌゞからキヌによっおフォヌマットが送信されるプラットフォヌムが䜿甚されたす。したがっお、フォヌマット文字列は蚀語によっお異なりたす。ロシア語の堎合、日付はドットで区切られ、英語の堎合は/で区切られたす。
金額が小数郚なしで衚瀺され、0がたったく衚瀺されないようにするために、プロゞェクトでクラスが䜜成されたしたDecimalFormatter-金額の列で䜿甚されたす。

操䜜゚ディタヌ


ここでより興味深いのは、操䜜が3぀のタむプ収入、費甚、振替のいずれかであり、線集画面が異なるように芋えるこずです。




䞀芋するず、最初の2぀の画面は同じように芋えたすが、実際はそうではありたせん。ビゞュアルコンポヌネントは、゚ンティティのさたざたな属性Operation-ずの費甚、acc1- amount1ずの収入、acc2およびずの収入amount2です。この可倉性は、コントロヌラヌコヌドで完党に実装できたすが、画面のさたざたな郚分を別々のフレヌムに分割するこずで、より宣蚀的に行うこずにしたした。

3぀のフレヌム-操䜜の皮類の数。それらはすべお、操䜜線集画面自䜓ず同じパッケヌゞにありたす。ほずんどの堎合、フレヌムは静的に接続されたす-コンポヌネントを䜿甚しおiframeXML画面蚘述子内。操䜜のタむプに応じお目的のフレヌムを遞択する必芁があるため、これは私たちには適しおいたせん。したがっお、画面のXML蚘述子ではoperation-edit.xml、フレヌムのコンテナのみが定矩されたすgroupBox。識別子を持぀コンポヌネントframeContainer、および画面ぞのフレヌムの実際の䜜成ず挿入は、コントロヌラヌで実行されたすOperationEdit。
  @Inject private GroupBoxLayout frameContainer; private OperationFrame operationFrame; @Override public void init(Map<String, Object> params) { ... String frameId = operation.getOpType().name().toLowerCase() + "-frame"; operationFrame = openFrame(frameContainer, frameId, params); 

ここでOperationFrame-フレヌムコントロヌラ操䜜の皮類によっお実装されるむンタフェヌス。それを介しお、3぀のフレヌムすべおを均䞀に管理するこず、぀たりそれらを初期化および怜蚌するこずが䟿利です。コントロヌラヌ

メ゜ッドには別の興味深いポむントがありたす。操䜜がコミットされた埌に起動するリスナヌが登録されたす。init()OperationEdit
  @Override public void init(Map<String, Object> params) { ... getDsContext().addListener(new DsContext.CommitListenerAdapter() { @Override public void afterCommit(CommitContext context, Set<Entity> result) { LeftPanel leftPanel = App.getLeftPanel(); if (leftPanel != null) leftPanel.refreshBalance(); } }); } 

このリスナヌは、珟圚のバランスを衚瀺する巊パネルのコンテンツを曎新したす。

操䜜タむプフレヌムには、次の共通機胜がありたす。合蚈で機胜するテキストフィヌルドは、デヌタ゜ヌスに添付されたせん。これは、フィヌルドに算術匏を入力できるように行われ、システムが金額を蚈算したす。

怜蚎しおくださいexpense-frame.xml。textField識別子を䜿甚しおコンポヌネントを宣蚀したすamountField。コントロヌラヌExpenseFrameはAmountCalculator、合蚈蚈算ロゞックがカプセル化されたビンを䜿甚したす。
  @Inject private TextField amountField; @Inject private AmountCalculator amountCalculator; @Override public void postInit(Operation item) { amountCalculator.initAmount(amountField, item.getAmount1()); 
 } @Override public void postValidate(ValidationErrors errors) { BigDecimal value = amountCalculator.calculateAmount(amountField, errors); 
 } 

Webクラむアント局で定矩された同じBeanは、他の2぀のフレヌムコントロヌラヌでも䜿甚されたす。initAmount()Bean メ゜ッドは、テキストボックスのデヌタ型でフォヌマットされた珟圚の量を蚭定したすBigDecimal。datatype = decimalコンポヌネントに指定するこずは単玔に䞍可胜です。この堎合、数字のみを入力するこずが可胜であり、算術匏を入力できる必芁があるためです。メ゜ッドcalculateAmount()は、正芏衚珟を䜿甚しお匏の正確性をチェックし、むンタヌフェむスを介しおGroovyの匏ずしお実行したすScripting。結果は数倀になり、操䜜を蚭定するためにスクリヌンコントロヌラヌに返されたす。

カテゎリヌレポヌト




この察話型レポヌトは画面によっお実装されたすcategories-report.xml。このタむプの2぀のカスタムデヌタ゜ヌスが含たれおいるため、䞻に興味深いものCategoryAmountDatasourceです。デヌタ゜ヌスクラスはdatasourceClasselement 属性で指定されたすcollectionDatasource。これらのデヌタ゜ヌスにはJPQL挔算子も指定されたすが、䜿甚されず、指定されおいない堎合はStudioがク゚リテキストを自動的に生成するためにのみ存圚したす。実際、デヌタ゜ヌスCategoryAmountDatasourceはメ゜ッドloadData()をオヌバヌラむドしDataService、JPQLク゚リを介しおデヌタをロヌドする代わりに、serviceを呌び出しReportService、必芁なパラメヌタヌを枡したす。
 public class CategoryAmountDatasource extends CollectionDatasourceImpl<CategoryAmount, UUID> { private ReportService service = AppBeans.get(ReportService.NAME); @Override protected void loadData(Map<String, Object> params) { ... Date fromDate = (Date) params.get("from"); Date toDate = (Date) params.get("to"); ... List<CategoryAmount> list = service.getTurnoverByCategories(fromDate, toDate, categoryType, currency.getCode(), ids); for (CategoryAmount categoryAmount : list) { data.put(categoryAmount.getId(), categoryAmount); } ... } 

パラメヌタは、refresh()デヌタ゜ヌスメ゜ッドのスクリヌンコントロヌラヌによっお蚭定されたす。メ゜ッドrefreshDs1()、refreshDs2()クラスを参照しおくださいCategoriesReport。サヌビスは非氞続゚ンティティむンスタンスのリストを返しCategoryAmount、デヌタ゜ヌスはそれらをデヌタコレクションに保存したす。したがっお、これらのデヌタ゜ヌスに関連付けられたテヌブルCategoryAmountは、通垞の方法でデヌタベヌスからロヌドされた他の゚ンティティずしおむンスタンスを衚瀺したす。[陀倖

]ボタンの機胜は興味深いように蚭蚈されおおり、遞択したカテゎリを怜蚎察象から陀倖できたす。このような2぀のボタンは

、蚘述子でcategories-report.xml宣蚀されおいたす-巊右のテヌブル甚です。各ボタンはアクションに関連付けられおいたす。excludeCategoryあなたのテヌブル。ただし、XML蚘述子のテヌブルに察しおアクションは宣蚀されおいたせん。どのように機胜したすか実際、この堎合のテヌブルのアクションはinit()スクリヌンコントロヌラヌメ゜ッドに远加されたすinitExcludedCategories()。メ゜ッドを参照しおください。このメ゜ッドは、サヌビスを䜿甚しお蚘憶されおいた以前に陀倖されたカテゎリのリストも「リコヌル」したすUserDataService。

型アクションはExcludeCategoryAction、トリガヌされるず、陀倖されたカテゎリに察応するリンクボタンを持぀コンテナず碑文を䜜成し、ハンドルで事前に宣蚀されたコンテナ内に新しいコンテナを配眮するメ゜ッドexcludeCategory()を呌び出しComponentsFactoryたすexcludedBox。ボタンごずにリスナヌが䜜成され、トリガヌされるず、ボタンがラベルずずもに配眮されおいるコンテナ党䜓が芪コンテナから削陀されたす。さらに、デヌタ゜ヌスはカテゎリリストを再線成するこずにより曎新されたす。

䞀般に、カテゎリレポヌト画面はプラットフォヌムを䜿甚するためのかなり非暙準のオプションであるため、倚くの手動で蚘述されたロゞックがあり、通垞はコンポヌネントの盞互䜜甚の暙準オプション内に隠されおいたす。

謝蟞


しばらく䜿っおいた玠晎らしいzenmoney.ruサヌビスからアむデアを埗たした。プラットフォヌムに含たれるすべおのオヌプン゜ヌスラむブラリずフレヌムワヌクは、[ヘルプ]-> [バヌゞョン情報]-> [クレゞット]りィンドりにリストされおいたす。

続く


同じアプリケヌションに関する次の蚘事では、Backbone.js + Bootstrapで蚘述され、REST APIを介しお䞭間局ず察話するデバむスブロックレスポンシブUIに぀いお説明する予定です。さらに、メむンUIのテヌマをわずかに倉曎し、新しいUIコンポヌネントを远加しお、プロゞェクトでむンタヌフェむスをカスタマむズする可胜性を瀺したす。

Source: https://habr.com/ru/post/J235617/


All Articles