Angular 2ずAureliaを䞊べお比范

画像



Web開発の䞖界では、 Angular 2のベヌタ版がリリヌスされたした 。 たた、リリヌス埌にどのように芋えるかに぀いおは、すでに想定するこずができたす。



しかし、評䟡自䜓は、真空䞭で、補造業者のパンフレットにある電子機噚の遞択に䌌おいたす。 ガゞェットにあるすべおのチップが蚘茉されおいたす。 そしお、そこにないものはすべお蚀及されおおらず、それらの存圚に぀いお考えるこずすらできないかもしれたせん。 したがっお、他の䜕かず比范しお評䟡する方がはるかに効率的です。



そのため、Angular 2ず新しい、しかし非垞に野心的なプロゞェクトであるAureliaを比范するずいうアむデアが生たれたした。 同時に、Habrの貯金箱にこのフレヌムワヌクに関する情報を補充したす。これは、これたでのずころ、Angular 2に関する情報よりもはるかに少ないためです。



ロヌンチの準備ができたプロゞェクトの圢匏の蚘事の䟋のコヌドはgithubに投皿されおいたす。 䟋はTypeScriptで蚘述されおおり、どちらもsystemjsを䜿甚しおいたす 。 systemjsの構成は、各フレヌムワヌクのクむックスタヌトガむドから取られたものであり、たったく異なりたす。 フレヌムワヌクの䜜者が提䟛した圢のたたにしおおくこずは合理的であるように思われ、䌌たようなものにしようずしないでください。 たた、プロゞェクトで䜿甚されおいるhttpサヌバヌはpushStateをサポヌトしおいないこずに泚意しおください承認枈みのプルリク゚ストがあるため、すぐにサポヌトされるこずを願っおいたす。したがっお、Angularにハッシュベヌスのルヌティングを含める必芁がありたした。



すべおのアヌキテクチャ機胜を培底的に比范するのではなく、フレヌムワヌクを評䟡するのは、゚ンドナヌザヌがどのようなメリットを埗るかを理解したいずいう芳点からです。 1぀の蚘事ですべおを比范しおも機胜したせん。そのため、この蚘事は䞀般的な構造に粟通しおいたす。 そしお、より難しい質問は第2郚に残りたす。



次のシナリオに埓いたす。





アりレリアずは䜕ですかなぜAngularず比范するのが正圓なのですか



同じHabréのAureliaに぀いおの情報はほずんどないため、すべおの読者がそれに぀いお聞いたわけではないず想定できたす。 ですから、オレリアの誕生の背景をお話ししたす。 さらに、それは非垞に興味深く、少し劇的ですらありたす。



Aureliaは、 Caliburn.Micro XAMLプラットフォヌム向けの非垞に人気のあるMV *フレヌムワヌクの䜜成者であるRob Eisenbergのプロゞェクトです。 圌は埌にDurandalず呌ばれるWeb甚のMV *フレヌムワヌクを開発したした。 デュランダルはあたり人気がありたせんでしたが、それでも非垞に興味深く゚レガントな゜リュヌションがあり、フレヌムワヌクはそれを非垞に愛するフォロワヌの聎衆を集めたした。



しかし、Rob EisenbergはDurandalのすべおの欠点を理解しおいたため、圌のサポヌトずずもに、 いわゆるNextGenフレヌムワヌクの開発に携わりたした。



2014幎1月、ngConfカンファレンスで、 John PapaはWeb開発の䞖界でよく知られ、DangrandalずNextGenフレヌムワヌクでRob Eisenbergによっお提案されたアむデアをAngularチヌムマネヌゞャヌBrad Greenず共有したした。 これらのアむデアはグリヌンに興味があり、アむれンバヌグず話をするこずにしたした。



䌚った埌、ブラッド・グリヌンずロブ・アむれンバヌグは、りェブずりェブ開発の未来に察する圌らの芋解が倚くの点で䞀臎しおいるこずに気づき、圌らは力を合わせるこずにし、アむれンバヌグはフレヌムワヌクの第2バヌゞョンでAngularチヌムで働き始めたした 。



しかし、10か月埌、圌はAngular 2の開発の方向性が倧きく倉わりすぎお、圌が協力するこずに同意したAngular 2ずは異なるため、Angularチヌムを蟞めるこずにしたした。



アむれンバヌグは短期間で、たずえばスコット・アレンなどのスタヌを含むかなり倧きなチヌムを線成し、倢の枠組みのもずに戻っおきたした。 この仕事の結果はアりレリアでした。



䞀般の人々はこのフレヌムワヌクを興味を持っお受け入れたした評䟡時点で最も簡単な方法ずしお、Aureliaはgithubで5,000個の星を収集したしたが、Angular 2では8,000 個の星を収集したした。



Angular 2ずAureliaで芏定されおいる䞀般的な原則は非垞に䌌おおり、同じクラスのプレむダヌです。 しかし、詳现なビゞョンず圌らが持っおいる機胜のセットはたったく異なっおいるため、比范が興味深いものになっおいたす。



Angular 2ずAureliaの航空写真の長所ず短所



フレヌムワヌクを遞択するずきに比范できる具䜓的な特性から、パフォヌマンスを芋おみたしょう。 Aureliaはdbmonsterベンチマヌクで興味深い結果を瀺しおおり、 Angular 2よりわずかに優れたポむントを叩き、 ReactおよびAngular1よりも顕著に優れおいたす。

dbmonsterずは
Dbmonsterは、 Ryan Florenceによっお開発されたレンダリングベンチマヌクです。 䜜業の速床を評䟡するために、絶えず曎新されるデヌタを含む配列がレンダリングされたす。これにより、フレヌムワヌクの速床を評䟡できたす。 このテストは元々、Angular 1、Angular 2、React甚に䜜成されたした。 Aureliaの開発者の1人であるJeremy Danyowは、埌にAureliaの実装を導入したした 。

ベンチマヌクを評䟡するずきは、次の点に泚意するこずが圹立ちたす。

  • スムヌズなスクロヌル-ペヌゞは「ゞャンプ」せずにスクロヌルする必芁がありたす
  • ツヌルチップ-マりスカヌ゜ルをリスト䞊に移動するず、ツヌルチップが描画されたす。 スムヌズに描画し、デヌタを遅滞なく衚瀺する必芁がありたす。
  • 再描画速床ずメモリ速床-右䞋隅に2぀のむンゞケヌタがありたす。 最初は1秒あたりの再描画数を瀺し、2番目はメモリ消費量を瀺したす
  • デヌタ倉曎の速床-ペヌゞの䞊郚には、デヌタ倉曎の頻床を調敎できるスラむダヌがありたす。 デヌタの倉曎率が䜎䞋しおも再描画率が増加しない堎合、これは、問題のフレヌムワヌクが倉曎を非効率的に監芖し、DOMの曎新に関する決定を䞋すこずを意味したす。


すべおのむンゞケヌタヌが正しく機胜し、最も「クリヌンな」結果を埗るには、クロムブラりザヌを䜿甚し、次のコマンドで実行するこずをお勧めしたす。

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir="C:\chrome\dev-sessions\perf" --enable-precise-memory-info --enable-benchmarking --js-flags="--expose-gc"
      
      









無圢の特性から、私は䞡方のフレヌムワヌクの最匷ず最匱の偎面を評䟡しようずしたす著者、私芋。

Angularの䞻な利点




アりレリアの䞻な利点




Angularの䞻な欠点




アりレリアの䞻な欠点






Angular 2ずAureliaの機胜、甚語、保存するもの



Angular 2ずAureliaのアヌキテクチャは非垞に䌌おいたす。 以䞋では、䞡方の䜜業の原則をいく぀かの段萜で定匏化しお、怜蚎および比范するのに意味のある基本的な甚語ず構成を斜䜓で瀺したす。 これが混乱した甚語ではなく、読みやすいテキストになるこずを願っおいたす。



Angular 2およびAureliaアプリケヌションのコアは、察応するテンプレヌトに関連付けられたコンポヌネントです。

アプリケヌション app を衚すルヌトコンポヌネントが必芁です 。 デコレヌタを䜿甚しお、メタデヌタをコンポヌネントにバむンドする必芁がありたす。



コンポヌネントの初期化は、 䟝存性泚入を䜿甚しお実行されたす。 たた、各コンポヌネントには、 ラむフサむクルフックず統合できる宣蚀されたラむフサむクルがありたす 。 コンポヌネントは階局構造に配眮できたす。



コンポヌネントずテンプレヌト間の状態の同期ず通信は、 デヌタバむンディングを䜿甚しお実行されたす 。 パむプ Angularたたは倀コンバヌタヌ+バむンディング動䜜 Aureliaを䜿甚しお、テンプレヌトを最終的なHTMLに埋め蟌むこずができたす。



ルヌティングは 、アプリケヌションの隔離された領域間を移動するために䜿甚されたす。 むベントは、アプリケヌションモゞュヌル間の通信に䜿甚できたす。



そしお最埌に、䟋に移りたす。



最初のコンポヌネントを䜜成する



角床2


たず、ルヌトコンポヌネントずなる最も単玔なコンポヌネントを䜜成するこずから始めたしょう。

 import {Component} from 'angular2/core'; @Component({selector: 'angular-app', templateUrl: 'app/app.html'} }) export class App { message: string = 'Welcome to Angular 2!'; }
      
      







Angularがモゞュヌルがコンポヌネントであるこずを理解するには、@ Componentデコレヌタヌでモゞュヌルをラップする必芁がありたす。



泚-厳密に蚀えば、@ Componentはデコレヌタヌではなくアノテヌションです。 ここで違いに぀いお読むこずができたす 。 蚘事では、Angular 2アノテヌションのドキュメントでは「デコレヌタ」セクションにあるため、デコレヌタずいう甚語は残しおおきたす。



少なくずも、デコレヌタはセレクタをテンプレヌトを描画する堎所を瀺す必芁がありたす。 この堎合、それは<angular-app>芁玠です。



テンプレヌトを宣蚀するための2぀のオプションがありたす。

  1. @ComponentデコレヌタのテンプレヌトパラメヌタずしおHTML文字列を指定したす。 このアプロヌチは、テンプレヌトがコンパクトで、別のHTMLペヌゞを䜜成したくない堎合に圹立ちたす。
  2. テンプレヌトのURLをtemplateUrlパラメヌタヌずしお指定したす。 別のペヌゞが必芁なので、このオプションを䜿甚したす




テンプレヌトは次のようになりたす。

  <div class="container"> <div class="navbar-header"> <a class="navbar-brand" href="#">{{message}}</a> </div> </div>
      
      







実際、これはコンポヌネント党䜓です。 簡単です。

良いこず -コヌドは、Angular 1よりもフレヌムワヌク自䜓の構造からよりクリヌンで自由です。これは朗報です。



最も単玔なコンポヌネントであっおもデコレヌタを䜿甚する必芁があるのは面倒です 。 ドキュメントから匕甚

各Angularコンポヌネントには、単䞀の@Componentず少なくずも1぀のViewアノテヌションが必芁です。 @Componentアノテヌションは、コンポヌネントがむンスタンス化されるタむミング、およびコンポヌネントがバむンドするプロパティずhostListenerを指定したす。



この堎合、この䟋で構成されたパラメヌタヌは、ほずんどの堎合、ある皮のロゞックに埓いたす。明瀺的な構成の代わりに、芏則を䜿甚できたす。より耇雑なシナリオではデコレヌタヌを接続する必芁がありたす。



アりレリア


Aureliaは芏玄に基づいお構築されおいるため、コンポヌネントはメタデヌタのない通垞のモゞュヌルです。

 export class App { message: string = "Welcome to Aurelia!"; }
      
      





暙準の芏則に埓っお、テンプレヌトの宣蚀のために、コンポヌネントに類䌌した名前のhtmlファむルを䜜成する必芁がありたす。぀たり、この䟋ではapp.htmlファむルになりたす。

 <template> <div class="container"> <div class="navbar-header"> <a class="navbar-brand" href="#">${message}</a> </div> </div> </template>
      
      







Aureliaの各テンプレヌトは、 テンプレヌト芁玠でラップする必芁がありたす。 Angular 2ず同様のむンラむンテンプレヌトを䜜成するには、 inlineViewデコレヌタを䜿甚できたす。 たた、Aureliaでは、芏則を倉曎し、高床なカスタマむズを実行できたす。 詳现はこちらをご芧ください 。



良いこず -コヌドは非垞にクリヌンで理解しやすいものです。 フレヌムワヌクの蚭蚈はありたせん。



䜕が気になる -あなたは同様の問題を解決するために倚くの泚釈を蚭定する必芁があるかもしれたせん。 たずえば、これらはinlineView、noView、useView、useViewStrategyです。 ドキュメントはただ十分ではなく、怜玢もされおいないため、䜕をどこで䜿甚するかに぀いお単玔に混乱するリスクがありたす。



ルヌティングを構成したす



私たちの堎合、各アプリケヌションにはいく぀かのペヌゞがあり、蚘事で抂説されおいる偎面が考慮されたす。 AngularずAureliaの䞡方で、ルヌティング自䜓ず本質的に同じであるため、ネストされたルヌティングは考慮したせん。

角床2


Angular 2でルヌティングを蚭定するには、@ RouteConfigデコレヌタをむンポヌトし、ルヌトにバむンドされるモゞュヌルをむンポヌトしお、ルヌティングマップを宣蚀する必芁がありたす。 アプリコンポヌネントでこれを行いたす。

 ... import {RouteConfig, ROUTER_DIRECTIVES} from 'angular2/router'; import {BindingSample} from './binding-sample/binding-sample'; import {ComponentSample} from './component-sample/component-sample'; ... @RouteConfig([ { path: '/component-sample', name: 'ComponentSample', component: ComponentSample, useAsDefault: true }, { path: '/binding-sample', name: 'BindingSample', component: BindingSample } ]) export class App { ... }
      
      







各ルヌトに぀いお、以䞋を瀺したす。

  1. ルヌトパタヌン
  2. ルヌト名マヌクアップでのバむンドに必芁
  3. ルヌトがアクティブ化されたずきにAngularが䜜成するコンポヌネントモゞュヌル
  4. これがデフォルトルヌトであるこずを瀺すuseAsDefaultオプションパラメヌタ


開始時にすでにルヌトがあるすべおのモゞュヌルをロヌドする必芁があるこずに混乱しおいる堎合は、非同期ロヌドを䜿甚できたす。 これを行うには、コンポヌネントパラメヌタヌの代わりに、ロヌダヌパラメヌタヌを䜿甚しお、目的のモゞュヌルをむンポヌトするプロミスを返す関数を指定したす。 そうしたすが、コヌド䟋は少し埌です。



テンプレヌトでルヌティングを䜿甚しおナビゲヌションを描画し、珟圚のコンポヌネントを描画するセクションを瀺すには、ROUTER_DIRECTIVESディレクティブのコレクションを远加むンポヌトし、@ Componentデコレヌタヌのディレクティブパラメヌタヌに远加する必芁がありたす。 合蚈で、app.tsモゞュヌルは次のようになりたす。



 import {Component} from 'angular2/core'; import {View} from 'angular2/core'; import {RouteConfig, ROUTER_DIRECTIVES} from 'angular2/router'; @Component({ selector: 'angular-app', templateUrl: 'app/app.html', directives: [ROUTER_DIRECTIVES] }) @RouteConfig([ { path: '/component-sample', name: 'ComponentSample', loader : () => System.import('app/component-sample/component-sample').then(m => m.ComponentSample), useAsDefault: true }, { path: '/binding-sample', name: 'BindingSample', loader : () => System.import('app/binding-sample/binding-sample').then(m => m.BindingSample) } ]) export class App { message: string = "Welcome to Angular 2!"; }
      
      







次に、app.htmlにナビゲヌションを远加したす。 これを行うには、 routerLinkディレクティブを䜿甚し、パラメヌタヌずしお配列を枡したす。その最初の芁玠は、@ RouteConfigのセットアップ時に指定したルヌト名を含む文字列です。

 
 <div id="navbar" class="collapse navbar-collapse"> <ul class="nav navbar-nav"> <li class="active"> <a [routerLink]="['ComponentSample']">Component sample</a> </li> <li> <a [routerLink]="['BindingSample']">Binding sample</a> </li> </ul> </div> ...
      
      







ネストされたルヌティングの堎合、パラメヌタヌは配列です。その埌、ルヌトの名前を含む数行の配列を枡したす。



ルヌトをパラメヌタヌ化する必芁がある堎合、パラメヌタヌを持぀オブゞェクトは配列の最埌の芁玠によっお送信されたす。

 ... <a [routerLink]="['BindingSample', {someParameter: 'someString'}]">Binding sample</a> ...
      
      





そしお最埌の瞬間。 珟圚のルヌトのテンプレヌトが描画される領域をマヌクアップで瀺す必芁がありたす。 同じapp.htmlでrouter-outletディレクティブを䜿甚しおこれを行いたす。

 <div class="container"> <router-outlet></router-outlet> </div>
      
      







良いこず -新しいルヌティングは、Angular 1.xに存圚しおいたrouteProviderよりも優れおいたすが、それでも倚くの疑問が生じたす。 ドキュメント内のルヌティングに関連するほずんどのタむプにはただ説明がたったくないため、明確に説明するこずは困難です。



混乱させるもの -いく぀かのこずを混乱させたす。 たず第䞀に、これはデコレヌタを介しお蚭定する必芁がありたす-たずえば、アプリケヌションに50のルヌトがある堎合、モゞュヌルのコヌドはこれらすべおの蚭定で単玔に倱われたす。 たた、ナビゲヌションスキヌムを構築するずきにif-logicが必芁な堎合、コヌドが悪倢になるリスクがありたす。

2぀目は、ルヌトのコレクション党䜓ぞの明瀺的なアクセスがないこずです。これは、各リンクを手動でレンダリングするのではなく、マヌクアップで簡単に゜ヌトしおナビゲヌション党䜓をレンダリングできたす忘れたす。 繰り返したすが、ルヌトを構築するためのif-logicがある堎合、テンプレヌトにこのロゞックを耇補しお、あたり倚く描画しないようにする必芁がありたす。



アりレリア


Aureliaの芏玄に埓っお、コンポヌネントのルヌティングを構成するには、configureRouterメ゜ッドを実装する必芁がありたす。このメ゜ッドはAureliaによっお自動的に呌び出されたす。 ネストされたルヌティングにも同じこずが蚀えたす。configureRouterメ゜ッドを持぀コンポヌネントは、ルヌティングスキヌムを圢成したす。

 export class App { message: string = "Welcome to Aurelia!"; router: any; configureRouter(config, router) { config.title = 'Welcome to Aurelia!'; config.map([ { route: ['', 'component-sample'], moduleId: 'app/component-sample/component-sample', nav: true, title: 'Component sample' }, { route: 'component-sample', moduleId: 'app/binding-sample/binding-sample', nav: true, title: 'Binding sample' } ]); this.router = router; } }
      
      





各ルヌトに぀いお、以䞋を瀺したす。

  1. ルヌトパタヌンたたは䞀連のパタヌン、空癜行パタヌンはデフォルトルヌトを意味したす。
  2. ルヌトをアクティブにするずきに開始するモゞュヌルの識別子。
  3. オプションのタむトルプロパティ-ルヌトをアクティブにするず、その倀がペヌゞタむトルに远加されたす。
  4. オプションのnavプロパティ-ルヌトをナビゲヌションモデルに含めるかどうかを指定したす。 数倀を指定する堎合、ナビゲヌションモデルコレクション内の芁玠の順序を意味したす。


転送された構成に基づいお、Aureliaはナビゲヌションモデルを䜜成したす。これはテンプレヌト内で゜ヌトされ、ナビゲヌションをレンダリングできたす。



  <div id="navbar" class="collapse navbar-collapse"> <ul class="nav navbar-nav"> <li repeat.for="row of router.navigation" class="${row.isActive ? 'active' : ''}"> <a href.bind="row.href">${row.title}</a> </li> </ul> </div>
      
      







最埌のステップは、珟圚のルヌトのテンプレヌトが描画される゚リアをマヌクアップで瀺すこずです。 同じapp.htmlでrouter-viewディレクティブを䜿甚しおこれを行いたす



  <div class="container"> <router-view></router-view> </div>
      
      







良いこず -セットアップは簡単で、非垞に明癜です。 Aureliaが私たちを助けようずし、ナビゲヌション甚のコレクションを構築しおいるのは玠晎らしいこずです。



玛らわしいこず -ナビゲヌションず比范しお、Durandalはルヌト蚭定に任意のプロパティを远加する機胜を削陀したした。 䞀方で、これは、nefigであるため、もちろん正しいです。 䞀方、これにより、手動レンダリングの方向でナビゲヌションモデルを䜿甚する可胜性が倧幅に枛少したす。 メニュヌ項目にタむトルだけでなく、たずえばツヌルチップも远加する堎合、ナビゲヌションモデルは圹に立ちたせん。



ネストされたコンポヌネントを远加する



角床2


テストプロゞェクトでネストされたコンポヌネントを操䜜する䟋に぀いおは、コンポヌネントサンプルフォルダヌがあり、必芁なものがすべお含たれおいたす。

したがっお、Angular 2でネストされたコンポヌネントを䜜成するには、次が必芁です。



  1. コンポヌネントを宣蚀し、メタデヌタをバむンドしたす。 芪コンポヌネントのデヌタを䜿甚しおプロパティを初期化するには、@ Componentデコレヌタに入力パラメヌタを远加し、察応するプロパティの名前を枡したす。

     import {Component} from 'angular2/core'; @Component({ selector: 'test-child-component', inputs: ['inputMessage'], template: `<div class="panel panel-default"> <div class="panel-heading">Child component title</div> <div class="panel-body"> Message from parent component is: {{inputMessage}} </div> </div>` }) export class TestChildComponent { inputMessage: string }
          
          





  2. 芪コンポヌネントcomponent-sample.tsに子コンポヌネントをむンポヌトし、@ Componentデコレヌタヌのディレクティブ配列に枡したす
  3. 芪コンポヌネントのテンプレヌトに、ネストされたコンポヌネントから指定されたセレクタヌに察応する芁玠を配眮し、パラメヌタヌを枡したす




その結果、芪コンポヌネントは次のようになりたす。

 import {Component} from 'angular2/core'; import {TestChildComponent} from './test-hild-omponent'; @Component({ template: ` <div class="sample-header"> <h1>{{message}}</h1> </div> <test-child-component [inputMessage]="messageForChild"></test-child-component>`, directives: [TestChildComponent] }) export class ComponentSample { message: string = 'This is a component with child component sample'; messageForChild: string = 'Hello to child component!'; }
      
      







良いこず -䞀般的に、すべおがシンプルで明確です。



あなたが悩むのは、アりレリアが持っおいる玠敵なパンがないこずです。 以䞋に説明したす。



アりレリア


Aureliaでは、カスタム芁玠ず構成ずいう2぀の方法でネストされたコンポヌネントを描画できたす。



䞀般に、最初の方法はAngular 2に䌌おおり、耇雑なコントロヌルの䜜成などに䜿甚されたす。 テストプロゞェクトコヌドでは、このアプロヌチはtest-custom-element.htmlファむルで瀺されおいたす。



2番目は䞻にマスタヌ詳现スクリプトに䜿甚され、より柔軟です。これは、ロヌドするコンポヌネント、描画するテンプレヌト、転送するデヌタを動的に瀺すこずができるためです。 このアプロヌチは、ファむルtest-hild-component.tsのテストプロゞェクトで実蚌されおいたす。



䞡方のオプションを順番に分析したす。



オプション1-カスタム芁玠


カスタム芁玠を䜿甚しおネストされたコンポヌネントを䜜成するには、次のものが必芁です。

  1. 通垞のコンポヌネントを䜜成し、さらにデコレヌタプロパティで@bindableをマヌクしたす。パラメヌタずしおテンプレヌトを通過する倀Angular 2の入力パラメヌタに䌌おいたす。 さらに、芁玠が単玔で動䜜しない堎合は、コンポヌネントを䜜成せずに、テンプレヌトを䜜成し、同じ名前の属性を䜿甚しおバむンド可胜なプロパティを䞀芧衚瀺するだけで枈みたす。 Aureliaコンポヌネントは「オンザフラむ」で䜜成したす

     <template bindable="message"> <div class="panel panel-default"> <div class="panel-heading">Custom element title</div> <div class="panel-body"> Message from parent component is: ${message} </div> </div> </template>
          
          





  2. 必芁なモゞュヌルを指す芪コンポヌネントのテンプレヌトにrequire芁玠を远加しAngular 2のディレクティブパラメヌタヌに䌌おいたすが、テンプレヌト内、必芁な堎所にマヌクアップでカスタム芁玠を描画したす。 パラメヌタヌは、<property name> .bind属性を䜿甚しお枡されたす。 その結果、芪コンポヌネントのテンプレヌトは次のようになりたす。

     <template> ... <require from="app/component-sample/test-custom-element.html"></require> <test-custom-element message.bind="messageForCustomElement"></test-custom-element> </template>
          
          







芁玠が普遍的に䜿甚される堎合、グロヌバルリ゜ヌスずしお登録できたす。 これにより、各テンプレヌトに<require ...>を蚘述できなくなりたす。 その方法に぀いおは 、「リ゜ヌスのグロヌバル化」セクションに蚘茉されおいたす。



Aureliaには、Angularで芋぀けるこずができなかったもう1぀の優れたオプションずしお、芪テンプレヌトからマヌクアップを枡す方法がありたす。 芁玠test-custom-element内の芪テンプレヌトでマヌクアップを宣蚀し、子で芁玠を远加する堎合

 <content></content>
      
      





次に、芪テンプレヌトからのマヌクアップが子に描画されたす。 たた、カスタム芁玠を䜿甚する堎合、前述のテンプレヌトパヌツを䜿甚しお、いく぀かの亀換可胜な領域を宣蚀できたす。



良いこず -すべおがシンプルで論理的です。

気になるこず -誰もがマヌクアップで䟝存関係を宣蚀する必芁があるずは限りたせん。



オプション2-構成


コンポゞションを䜿甚しおネストされたコンポヌネントを䜜成するには、次のものが必芁です。

  1. 通垞のコンポヌネントを䜜成したす。 composeは匱く接続されたコンポヌネントを想定しおいるため、デヌタ転送にラむフサむクルフックを䜿甚する必芁がありたす Angular 2にもこれらがありたすが、次の蚘事ではそれらに぀いお。 この堎合、activateメ゜ッドを䜿甚したす。 テンプレヌトは小さいので、むンラむンにしたす。

     import {inlineView} from 'aurelia-templating'; @inlineView('<template><h3>${inputMessage}</h3><template>') export class TestChildComponent { inputMessage: string; activate(inputMessage: string) { this.inputMessage = inputMessage; } }
          
          





  2. 芪芁玠のテンプレヌトに、compose芁玠を配眮したす。この芁玠には、子コンポヌネントを持぀モゞュヌルの識別子を瀺したす。 芪コンポヌネントから子にデヌタを転送するには、model.bind属性を䜿甚したす。

     <compose model.bind="messageForChild" view-model="app/testChildComponent"></compose>
          
          







これは良いこずです -私の意芋では、composeはプロゞェクトの耇雑さに察凊するための非垞にクヌルな方法です。 柔軟性を高めながら、コンポヌネント間の分離を提䟛したす。



䜕が気になる -私は長い間この項目に぀いお考えたしたが、私は䜕も曞くこずができたせんでした。 私は文句を蚀うこずは䜕もありたせん。



デヌタバむンディング



角床2


Angularチヌムが新しいデヌタバむンディングの開発で行った䞻な䜜業は、䜿甚するディレクティブの数を最小限に抑え、デヌタ移動の方向を明確に区別するこずでした。DOMぞ、DOMから、双方向。 順番にすべおを芋おみたしょう。



DOMぞ


DOMぞの単方向バむンディングは、2぀の圢匏を䜿甚しお実行されたす。

文字列補間

 <div class="panel-body"> This string is builted with {{interpolationString}} syntax </div>
      
      





およびプロパティのバむンド

 <img [src]="iconUrl" />
      
      





文字列補間の堎合、二重山括匧で囲たれたテキストは匏ずしお評䟡され、実行され、その結果がテンプレヌトに配眮されたす。 ぀たり、コンポヌネントのプロパティだけでなく、この皮の匏をバむンドするこずもできたす。

 <h1>2 = {{1+1}}</h1>
      
      





ただし、この機胜を乱甚せず、耇雑な匏をコンポヌネントのプロパティに入れないこずをお勧めしたす。



プロパティバむンディングの堎合、キヌは角かっこです。これは、テンプレヌト゚ンゞンに、これが匏の結果を右に割り圓おるプロパティの名前であるこずを通知したす。このフォヌムでは匏もサポヌトされおいたすが、乱甚はお勧めしたせん。暙準のプロパティに加えお、routerLink、textContentなどの远加のディレクティブセットがありたす。



泚-Angular 2でテンプレヌトを開発する堎合、実際にはHTMLではなく、特別なAngular 2構文で蚘述したすテンプレヌトを解析するには、独自のパヌサヌを䜿甚したす。そしお、あなたが曞くずき、䟋えば

 <input value="some text" />
      
      





これは、属性に倀が割り圓おられる「玔粋な」HTMLではなく、定数の割り圓おに分解される構文糖衣です。

 <input [value]="'some text'" />
      
      









重芁な点は、デヌタを属性、クラス名、およびスタむルにバむンドするために、クラス、スタむル、およびattrプレフィックスを䜿甚する別個の構文が必芁であるこずです。 たずえば、次のように

 <img [style.width]="iconWidth" [style.height]="iconHeight" [src]="iconUrl" />
      
      





スタむルの耇数のプロパティたたは耇数のクラスを同時に蚭定するためのngClassおよびngStyleディレクティブがありたす。匏の結果ずしお、各プロパティがスタむルプロパティたたはクラス名ずしお評䟡されるオブゞェクトを期埅したす。



プロパティバむンディングを属性バむンディングから分離するポむントは、html属性ずDOM芁玠のプロパティに明確な違いがあるこずです。属性は芁玠を初期化するために䜿甚され、プロパティは芁玠の状態を倉曎するために䜿甚されたす。属性を䜿甚するのはAngular 2です。



ドムから


この堎合、すべおがシンプルです。これはむベントハンドラヌのバむンドです。

 <input type="button" (click)="onClicked()" value="Click me!" />
      
      





このバヌゞョンのキヌは括匧で、その䞭にむベントの名前を曞きたす「on」プレフィックスなし。バむンディングの右偎の匏の䞭では、$むベント倉数が䜿甚可胜です。これは実際にはDOMむベントです。これにより、最も単玔なハンドラヌに察しお個々の関数を宣蚀せず、むンラむン匏を蚘述できたせん。ただし、繰り返したすが、この方法で耇雑な構造に関䞎しお蚘述しおも意味がありたせん。



䞡方向


実際、双方向のデヌタバむンディングは、DOMからDOMぞの組み合わせを䜿甚しお実行できたす。

 <input [value]="twoWayBindedProperty" (input)="twoWayBindedProperty=$event.target.value" />
      
      





ただし、これは非垞に兞型的なシナリオであるため、Angularチヌムは特別なngModelディレクティブを開発したした。

 <input [(ngModel)]="twoWayBindedProperty" />
      
      







必芁に応じお、党䜓を個別の郚分に分解し、DOMからの指瀺のためにngModelChangeディレクティブが必芁です。

 <input [ngModel]="twoWayBindedProperty" (ngModelChange)="twoWayBindedProperty=$event">
      
      







泚[]、b []の構文ず混同されおおり、暙準オプションを奜む堎合、接頭蟞bind-、on-、bindon-をそれぞれ䜿甚できたす。䟋

 <img bind-src="iconUrl">
      
      







これは良いこずです-控えめに蚀っおも、構文が異垞であり、圌に向けられた倚くの吊定的な声明が既にあるずいう事実にもかかわらず、私は圌が個人的に奜きです。たず、それは非垞に顕著です。第二に、芚えやすいこずです。第䞉に、圌はさたざたな線集者のむンテリセンスず良い友達になりたす。これは最初のキャラクタヌから、これがAngular 2コンストラクトであるこずは明らかであり、すぐにディレクティブオプションを受け取り、これらのngClass、ngModelなどをすべお芚える必芁はありたせん 第4に、これらすべおの括匧に完党にうんざりしおいる堎合は、暙準圢匏に倉曎できたす。



混乱するこず-Aureliaずは察照的に、1回限りの拘束力ずむベント委任の可胜性は十分ではありたせん。しかし、これらのこずは䞀般的なケヌスでは重芁ではありたせん。



アりレリア


Aureliaのデヌタバむンディングは、デヌタの移動方向の埮調敎に重点を眮いおいたす。フレヌムワヌクはいく぀かの合理的な仮定を行いたすが、開発者は自分で決定する機䌚を残したす。最終的に、次のオプションがありたす。



文字列補間


 <div class="panel-body"> This string is builted with ${interpolationString} syntax </div>
      
      





Angular 2の文字列補間ず同様に、構文のみが異なりたす{{}}ではなく$ {}



プロパティのバむンド


匏<property name>。<Binding type> = "expression"に短瞮されたす。バむンディングのタむプは次のずおりです。



明らかに、䞀般にプロパティバむンディングの構文は次のずおりです。

 <input value.bind="iconUrl" />
      
      







Angular 2のように暙準プロパティをバむンドするこずに加えお、innerHTML、textContent、styleのカスタム属性がありたす。.bindを远加しおプロパティを指定する堎合ず、.bindを䜿甚せずに文字列補間を䜿甚する堎合の2぀のスペルオプションがありたす。

 <div innerhtml.bind="htmlProperty"></div> <div innerhtml="${htmlProperty}"></div>
      
      







むベントハンドラヌ


むベントハンドラをバむンドするには、2぀のオプションがありたす。



Angular 2のように、ハンドラヌ匏内のむベントにアクセスするには、$むベント倉数を䜿甚できたす。



泚NDCロンドンでのスピヌチで、アむれンバヌグは、Aurelia構文はプラグむンで簡単に曞き換えるこずができ、Angular 2構文を䜿甚しおAureliaでのデヌタバむンディングを瀺しおいたすが、このプラグむンはどこにも芋぀かりたせんでした。



良いのは、必芁に応じお埮調敎できるこずです。バむンドオプション1回。HTML暙準ずの完党な互換性。



面倒なのは、䞀回限り、䞀方向、双方向のオプションの詳现な構文です。たた、IntelliSenseのサポヌトは、Angularほどクヌルではありたせん。



デヌタバむンディングの制埡構造



角床


制埡構造for、if、switch


読者はすでに疲れ始めおいるず思うので、詳现には觊れたせん。䞀般的な構文を芋おください



 <div class="panel-body"> Select something: <select [(ngModel)]="selectedClass"> <option *ngFor="#alertClass of alertClasses" [value]="alertClass">{{alertClass}}</option> </select> </div> <div class="panel-body"> <div [ngSwitch]="selectedClass"> <template [ngSwitchWhen]="'success'"> <div class="alert alert-success" role="alert">You will be successfull if you learn Angular</div> </template> ... <template ngSwitchDefault>You must choose option</template> </div> <div *ngIf="selectedClass=='success'"> <div class="alert alert-success" role="alert">Extra message with *ngIf binding</div> </div> </div>
      
      







䞀般的に、異垞なこずは䜕もありたせん。泚意すべきは、ngForずngIfの構文です。*文字がディレクティブの前にありたす。ドキュメントで説明されおいるように、これはテンプレヌト芁玠でテンプレヌトをラップするこずを避ける䞀皮の構文糖です。



テンプレヌトでロヌカル倉数を䜜成する




ロヌカル倉数は、htmlテンプレヌトのさたざたな領域のデヌタにアクセスするために必芁です。ngForルヌプで既に芋た倉数を䜜成する最も簡単な䟋

 <option *ngFor="#alertClass of alertClasses" [value]="alertClass">{{alertClass}}</option>
      
      







特殊文字を䜿甚しお、テンプレヌト内でアクセスする倉数を宣蚀しおいるこずをAngularに瀺したした。珟圚の配列芁玠のむンデックスを瀺す倉数を䜜成するこずもできたす。

 <option *ngFor="#alertClass of alertClasses, #index=index" [value]="alertClass">{{index}} {{alertClass}}</option>
      
      







たたは正芏の代替「val-」を䜿甚した倉数の別の宣蚀は、ngForルヌプの倖偎に適甚できたす。この堎合、倉数は倉数が宣蚀されたhtml芁玠を指したす。この倉数は、たずえばむベントハンドラヌで䜿甚できたす。しかし、テンプレヌトでは、そのような倉数は機胜したせん。぀たり、監芖は実行されたせん。

 <input #i placeholder="Type something"> <input type="button" class="btn btn-success" (click)="displayTextboxValue(i.value)" value="And click" /> <br/> But templating doesn't work with it - {{i.value}}
      
      





アりレリア


制埡構造for、if、show


Aureliaスむッチが実装されおいないずいう事実から始める䟡倀がありたす少なくずも珟時点では。たた、Aureliaの甚語では、制埡構造はデヌタバむンディングを指すのではなく、先ほど芋た構成のようにHTML拡匵を指すこずに泚意しおください。



党䜓ずしお、制埡構造から、䌚瀟のためにここに描かれおいる繰り返し、もし、衚瀺したす

 <div class="panel-body"> Select something: <select value.bind="selectedClass"> <option repeat.for="alertClass of alertClasses" value.bind="alertClass">${alertClass}</option> </select> </div> <div class="panel-body"> <div if.bind="selectedClass=='success'" class="alert alert-success" role="alert">You will be successfull if you learn Aurelia</div> ... <div show.bind="selectedClass=='success'"> <div class="alert alert-success" role="alert">Extra message with show extension</div> </div> </div>
      
      





さらに、repeat内で匏を蚘述する堎合、次の倉数を䜿甚できたす。





テンプレヌトでロヌカル倉数を䜜成する


䞊蚘のrepeat内でロヌカル倉数を䜜成するための構文は既に芋たした。Angular 2ず比范するために、HTML芁玠を指す倉数を䜜成する方法を確認する必芁がありたす。これにはref属性が䜿甚されたす。䜜成された倉数は、むベントハンドラヌずテンプレヌトの䞡方で䜿甚できたす。぀たり、監芖が実行されたす。



 <div class="panel-body"> <input ref="i" placeholder="Type something"> <input type="button" class="btn btn-success" click.delegate="displayTextboxValue(i.value)" value="And click" /> <br/> And templating works with it - ${i.value} </div>
      
      





恥ずかしいこず -気配りのある読者は、Angular 2の郚分に「䜕が良いのか-恥ずかしいのか」ずいうメモがないこずに気付くこずがありたす。私はこのセクションを結合し、䞡方に぀いお曞くこずにしたした、なぜならそれらには1぀の問題があるからです。この問題は、テンプレヌトに゚ラヌがある堎合、垞に䞡方の゚ラヌがスロヌされるこずではありたせん。たずえば、䞡方のフレヌムワヌクのifの䟋でプロパティ名を誀っお蚘述しようずするず、䞡方が静かに動䜜し続けたす。

そのため、私たちは間違いやタむプミスを抱えおいたす。



以䞊です。 読んでくれおありがずう:)



All Articles