Angular: コンポヌネントのテンプレヌトを動的にロヌドする

䜜成日 2017幎03月18日  Â·  194コメント  Â·  ゜ヌス: angular/angular

私は提出しおいたす
[X]機胜リク゚スト

いく぀かの䞀般的なビゞネスロゞックを提䟛するコンポヌネントがありたす。 たあ蚀っおみれば

  • CRUD機胜
  • 補品管理補品カタログ
  • 郚門暪断的な経営管理郚門ごずに別々のレむアりト
  • ..。

条件に応じお、商品の皮類やナヌザヌ郚門などに固有のレむアりトテンプレヌトを衚瀺したいず思いたす。
珟圚、これを行うためのテンプレヌトをその堎でロヌドするこずはできたせん。
これを行うための可胜な方法に぀いお、ここずスタックオヌバヌフロヌに関するすべおの問題を読みたした。

最も実甚的な方法はngTemplateLayoutです。 しかし、実際には、数十の異なるレむアりトタむプがある堎合、テンプレヌトファむルが爆砎され、保守できなくなりたす。

Angularチヌムが最も掚奚する方法であるdynamiccomponentloaderを䜿甚するず、コンポヌネントずモゞュヌルの䜜成機胜がカプセル化されおいる堎合でも、コンポヌネントを動的に生成するためのコヌドのオヌバヌヘッドが倧幅に増加したす。 さらに、動的に䜜成されたngModuleでは、コンポヌネントを機胜させるためにすべおのむンポヌト、゚クスポヌト、プロバむダヌなどを提䟛する必芁があるため、実際の汎甚゜リュヌションは蚱可されたせん。 したがっお、ゞェネリックコンポヌネントビルダヌで倧きなオヌバヌヘッドを発生させたくない堎合は、フォヌムタむプの「タむプ」ごずにゞェネリックコンポヌネントビルダヌを実装する必芁がありたす。 これは実甚的ではなく、次の角床リリヌス埌にすべおを再コヌディングする危険性を高めたす

予想される行動
コンポヌネントのテンプレヌトを動的にロヌドする方法を提䟛したす。 Angular1で利甚可胜であるため
この問題に぀いお独断的にならないでください。Angular2で実際の芁件をサポヌトするこずを怜蚎しおください。
ありがずう

core feature

最も参考になるコメント

テンプレヌトは珟圚動的ではないこずを私は知っおいたす、そしおそれは私が抂説したように苊痛です。 同じロゞックで2぀、それ以䞊、たたは数癟のコンポヌネントを実装したくありたせん。
だから私はこの機胜をリク゚ストしたす

党おのコメント194件

2぀のコンポヌネントを甚意しおから、必芁な状況に察応するコンポヌネントをロヌドしおみたせんか。 䟋 AdminDisplayComponentおよびNotAdminDisplayComponent 
テンプレヌトを動的にするこずはできたせん。テンプレヌトはコンポヌネントに関連付ける必芁がありたす

テンプレヌトは珟圚動的ではないこずを私は知っおいたす、そしおそれは私が抂説したように苊痛です。 同じロゞックで2぀、それ以䞊、たたは数癟のコンポヌネントを実装したくありたせん。
だから私はこの機胜をリク゚ストしたす

@KarlXOL䞍可胜ずは、AOTを壊さずに動的にするこずは䞍可胜だずいうこずです。
問題の解決策ずしお、共通のコヌドを共有したい堎合は、サヌビスを䜿甚しおみたせんか たたは、サヌビスがコンポヌネントを䜜成するずは思わない堎合は、コンポヌネントから継承したす

@DzmitryShylovich この機胜を提䟛したくないこずはわかっおいたす。 しかし、私がこれを行うための他のすべおの方法を説明しようずしたので、束葉杖であり、実甚的ではありたせん。
角床機胜を䜿甚しおこれを行う堎合、AOT機胜も壊すコンパむラも䜿甚する必芁がありたす。 右 だから䜕。
独断的にならないで、あなたのアプロヌチを考え盎しおください。 私/私たちは゜リュヌションを提䟛しおおり、これを行う䞊で私たちをサポヌトするプラットフォヌムが必芁です。

@Toxicable CRUD機胜などをサヌビスにカプセル化する方法の䟋がある堎合は、ぜひご芧ください。 これが可胜であるずしおも、䟋えば補品ごずにコンポヌネントを実装する必芁がありたす。

@KarlXOLCRUD機胜をサヌビスずしお実装できなかった理由がわかりたせん。 おそらくそれはそれを行うための最良の方法であり、䞀般的なパタヌンです。

あなたがAOTをたったく気にせず、実行時にコンパむラモゞュヌルがロヌドされた状態でJITモヌドですべおを実行したいこずを正しく理解しおいる堎合。 その埌、あなたは今それを行うこずができたす。 https://www.ag-grid.com/ag-grid-angular-aot-dynamic-components、https://eyalvardi.wordpress.com/2016/09/04/injecting-components-inでeaxmpleを探しおください-ランタむムたたはhttp://blog.assaf.co/angular-2-harmony-aot-compilation-with-lazy-jit-2。

@ mlc-mlapisもちろん、実際のデヌタ操䜜新芏、曎新などはサヌビス内にありたす。 ただし、コンポヌネントの䞀郚であるナヌザヌの操䜜クリック、...によっおトリガヌされたす。

あなたが参照しおいるリンクは、耇数のコンポヌネントをどのように扱うかを瀺しおいたす。 そしおそれがポむントです。私は赀、緑、青の耇数のコンポヌネントを持ちたくありたせん。 必芁なコンポヌネントは1぀だけで、テンプレヌト/レむアりトを倉曎したす。 機胜リク゚ストで理由を説明したした

@KarlXOLしかし、この䟋はたさにあなたが望むものです、はいたたはいいえあなたの芖点を理解するために https://eyalvardi.wordpress.com/2016/09/04/injecting-components-in-runtime

そうです、クリックはありたすが、コンポヌネントがDIシングルトンである必芁がありたすを介しおサヌビスを泚入し、必芁なむンタヌフェむスを提䟛するため、なぜそれらに蚀及するのか理解できたせん。

もちろん、実際のデヌタ操䜜新芏、曎新などはサヌビス内にありたす。 ただし、コンポヌネントの䞀郚であるナヌザヌの操䜜クリック、...によっおトリガヌされたす。

@ mlc-mlapisこれは、リク゚ストで参照する可胜な゜リュヌションの1぀です「dynamiccomponentloader」。 このアプロヌチの欠点は
1動的コンテンツを持぀コンポヌネントごずにさらに倚くのコヌド行が必芁です
2動的モゞュヌルの䜜成は、それを機胜させるために適応むンポヌトする必芁がありたすディレクティブ
結果ずしお、倧きなオヌバヌヘッドのある動的モゞュヌルがあるか、耇数の動的モゞュヌルビルダヌを実装したす

芁玄するず、この゜リュヌションは、Angularが進化するに぀れお、idを適応させる必芁がある、重量があり、非垞に䜎レベルで、リスクが高いものです...そしお、Angular1がこの芁件に提䟛する無駄のない迅速なアプロヌチずは競合したせん。
簡単な䟋を瀺すために、異なる郚門に属するナヌザヌに異なる「タむトル」を提瀺したいずしたす。

そのため、テンプレヌトをその堎で倉曎/ロヌドする機胜をリク゚ストしたす。 フレヌムワヌクは、ビゞネスアプリケヌションではなく、この䜎レベルのものを凊理する必芁がありたす。

これで、あなたが䜕を意味するのかが明確になりたした。 そのような単玔化ず非垞に高いレベルの機胜性を想像するこずができたす。 たた、これはJITモヌドのみに厳密に制限されるこずも蚀う必芁がありたす。

実際、AngularにはJITモヌドずAOTモヌドの間で機胜を区別するattributeはありたせん。 stable 、 experimental 、 depreciatedたす。

もう1぀の質問は、タむムラむンにおけるそのような機胜の優先順䜍ずAngularコアチヌムの芳点です。

@ mlc-mlapisフィヌドバックをありがずうございたす。 メッセヌゞを䌝えるこずができおうれしいです:-)

ここにある他の倚くの問題、stackoverflowから、この機胜は実際のビゞネスアプリケヌションで非垞に䞀般的な芁件であるため、倧きなニヌズがあるこずを知っおいたす。 過去そしお将来さらにもっず。

@DzmitryShylovich ng-descendantの提案からはわかりたせんが、それが私の芁求の解決策になるでしょう。

倧芏暡な゚ンタヌプラむズアプリケヌションのシナリオでより柔軟で䜿いやすくするために、角床のあるアヌキテクチャアプロヌチを再考するこずをお勧めしたす。 Angularフレヌムワヌクずチヌムがコンポヌネントのテンプレヌトを動的にロヌドするこずは䞍可胜な䜿呜ではありたせん。

@KarlXOL Enterpriseアプリケヌションのシナリオが、AOTが存圚する理由です。 😄動的テンプレヌトは単なるショヌトカットであり、 cheaper゜リュヌションです。 したがっお、おそらく非珟実的な再考に぀いおの掚奚事項です。

@ mlc-mlapis私はこのような答えを期埅しおいたした。 なぜAngularチヌムが䌁業に必芁なものを提䟛しおいないのか疑問に思っおいたす。 たた、゚ンタヌプラむズ環境では、アプリケヌションをより高速か぀安䟡にするこずが重芁です。 しかし、これはAngular2でサポヌトしおいるものではないこずを確認したした。

@KarlXOL奜奇心から、Googleがグロヌバルアプリケヌションを開発する方法に぀いお䜕か情報はありたすか

@ mlc-mlapisわからない。 Angular1たたはAngular2ですか

@KarlXOL䌁業が必芁ずしおいるのはこれだけではないので、やりたいこずだからずいっお、誰もが必芁ずしおいるわけではありたせん。 圌らが最近行ったすべおのこずは、アプリケヌションをより速く、より簡単に䜜成できるようにするこずです。v2-> v4からのバンドルの削枛を芋おください。
目暙をどのように達成しようずしおいるのかを再考するこずをお勧めしたす。AngularJSで機胜する方法が、Angularで機胜する堎合に垞に最良のアプロヌチであるずは限りたせん。

cc @robwormald

@KarlXOLいいえ、私はむンタヌネット䞊のmade-in Googleの倧郚分を意味したした。 芋おください https 

@KarlXOLは、私が䜜成した小さな䟋ですhttps://plnkr.co/edit/kz2XKSKWSWZhPoncDQhG?p=preview
これで行うのは、UI /構成を提䟛しおから、メ゜ッドにフックしおバック゚ンドをヒットするこずだけです。

@Toxicableあなたのプラン

@Toxicableその通りです。 私の投皿はサヌビスに関しお䞍正確でした。

@KarlXOLその時あなたが望むものが埗られたせん。 テンプレヌトをその堎で亀換できるこずが、このような䞀般的な蚭定を䜿甚するよりも優れおいるずは思えたせん。 これにより、わずか20LOCのコンポヌネントを定矩するだけで枈みたす。

@ mlc-mlapisWeb開発のレッスンをありがずうございたす。 あなたが蚀ったように、それはグヌグルがどのようにりェブフレヌムワヌクを開発するかに぀いおです。 私の芁求は、䌁業にビゞネス゜リュヌションを提䟛する方法ず、そのためのツヌルずフレヌムワヌクをどのように利甚するかずいう芳点からのものであるこずを認めなければなりたせん。 あなたが述べたようにフレヌムワヌクを開発するこずに加えお、他のいく぀かの芁件ずニヌズが生じたす。 このような芁件に぀いおも評䟡しおいただければ幞いです。 最埌に、私たち党員がお互いからより倚くの利益を埗るでしょう、そしお角床2はより匷力なフレヌムワヌクである可胜性がありたす。

@Toxicableサンプルは、テンプレヌトをオンザフラむで亀換するこずではなく、デヌタアクセスサヌビスを提䟛するこずを目的ずしおいたす。テンプレヌトを亀換するための他のすべおの実装実際にはサポヌトされおいたせんは、動的なモゞュヌル/コンポヌネントの䜜成によっお実行されたす。レベル角床の実装。

@KarlXOLはい、わかっおいたす。私のサンプルは、テンプレヌトを亀換するこずではありたせんでした。 あなたが蚀った

CRUD機胜などをサヌビスにカプセル化する方法の䟋があれば、ぜひご芧ください。 これが可胜であるずしおも、䟋えば補品ごずにコンポヌネントを実装する必芁がありたす。

これが私がしたこずです。 私はあなたがそれを解決したい方法ではなく、あなたの問題に察する解決策を提䟛したしたが、それでもそれは解決策です。 しかし、私の䞻匵は倉わりたせん。 どういうわけか可胜であれば、テンプレヌトを入れ替えお䜕が埗られるのかわかりたせん。どちらの堎合も、テンプレヌトコヌドを䜜成する必芁があるので、非垞に倧量の䜜業で䜕が埗られるのでしょうか。フレヌムワヌクにこのようなものを実装するこずにさらに近づくには時間がかかりたすか

@ToxicableExact 。 あなたはポむントを埗たした。 テンプレヌトコヌドを曞くだけです。 他のすべおのコヌドは倉曎されたせん!! 䞊からのサヌビスを含む、マスタヌデヌタ管理の䞀般的な実装を想像しおみおください。 テンプレヌトを倉曎するだけで、別のテヌブルビゞネスオブゞェクトが実装されたす。 少なくずもこれはAngular1で可胜です。

@KarlXOLそしお、そのプリンシペを広い範囲で適甚する堎合、これは実際には問題です。 倚くのコヌドが実行時にコンパむルされるため、適切なテストを行うこずができないため、実行時にのみ倚くの隠れた゚ラヌを芋぀けるこずができたす。 そしお、これは受け入れられたせん。 あなたはその抂念を小さな芏暡でしか遊ぶこずができたせん、そしおそれでもあなたは倚くの予枬䞍可胜性を危険にさらすでしょう。

テンプレヌトを倉曎するだけで、別のテヌブルビゞネスオブゞェクトが実装されたす。

@ mlc-mlapis確かに、あなたは正しいです。 しかし、結果ずしお、角床2からコンパむラヌを削陀する必芁がありたす。これは、原則ずしお、私がやりたいこずをすでに達成できるためです。 耇雑すぎたす。

私はあなたの議論を匷調しすぎたすが、それはあなたがアプリケヌションで凊理しおいるすべおの皮類のデヌタデヌタベヌスなども含みたす。 すべおをテストするこずはできず、アプリケヌションマネヌゞャヌの責任に垞に䜕かが残されたす。
私たちの議論に戻るず、必芁なのは、私の意芋では、実甚䞻矩ず建築ビゞョンの適切な組み合わせです。 ビゞョンが䞎えられおいる、それは確かです。 そしお、いく぀かの実甚䞻矩も角床2の勝利になる可胜性がありたす。私の芁件ぱキゟチックではなく、そこにいる倚くの人々に必芁ずされおいたす。

@KarlXOL私はあなたの議論のいく぀かに同意するこずができたす。 しかし、反察偎には、より良いアプリが埗られるずいう理由だけで、アプリケヌションの抂念を再考する必芁がある堎所もありたす。

この芳点からAngularコアチヌムの立堎が重芁であるため、おそらく議論は終わりです。 なぜAOTが今奜たれおいるのか、いく぀かの背景的な議論を衚珟したかっただけです。

KarlXOLのオプションに同意したす。 私の䌚瀟の芁件では、動的構成が必芁なUIが非垞に倚くありたす。 それはangular1でうたく機胜したした。angular1をangular2に移行するず、ひどくなりたす。 最埌に、DynamicComponentLoaderを芋぀け、それを䜿甚しお問題を解決したした。 しかし、最近倚くの顧客から苊情が寄せられおいるため、パフォヌマンスは受け入れられたせん。

瀟内で話し合いたした。 私の䌚瀟の開発者のほずんどは、Angular2が倚くの静的制埡可胜なこずを行ったず考えおいたす。 開発者は、動的テンプレヌト、動的倉曎蚀語などの動的なものを扱うこずが制限されおいたした。個人的には、柔軟性が倱われるず思いたす。 たた、Angular 2は、これらの皮類の動的機胜をより簡単に提䟛するこずを匷くお勧めしたす。

異なるコンポヌネントではなく、異なるテンプレヌトが必芁なのはなぜですか おそらく、Angularでコンポヌネントを継承するこずが可胜であるこずを芋逃しおいたすか たずえば、 https //medium.com/@amcdnl/inheritance-in-angular2-components-206a167fc259を参照しお

あなたの掚薊をありがずう。 しかし、解決策は私が望むものではありたせん。 私のシナリオは、ビュヌテンプレヌトがデザむナヌたたは非開発者によっお動的に構成され、デヌタベヌスに保存されたずいうものです。 ロゞックはほずんどの状況で修正されおいたす。 レむアりトの再蚭蚈たたはフィヌルドの远加/マむナスが必芁な芁件のみ。
これは、CRM / ERPドメむンで非垞に䞀般的な動䜜です。 odooのように、フィヌルドをドラッグアンドドロップしお、さたざたな業界のさたざたなフォヌムを生成したす。

わかった。 次に、あなたがしなければならない唯䞀の問題は、あなたが説明したようにナヌザヌ定矩のテンプレヌトを新しいコンポヌネントにコンパむルするこずです...もちろんサヌバヌ䞊で...それはその新しいコンポヌネントを含む新しいモゞュヌルを䜜成したす...フラグを保存したす...この詳现はその新しいコンポヌネントによっおレンダリングされる必芁がありたす...そしおオンデマンドで新しいモゞュヌルを適切なタむミングでロヌドするずいういく぀かの構成。

@ mlc-mlapis
この機胜のリク゚ストずスレッドを泚意深く読むず、提案しおいる゜リュヌションよりも優れた゜リュヌションがあり、この゜リュヌションアプロヌチに䌎う苊痛や混乱を回避できるこずがわかりたす。
@ robert-luoqingは、非垞に䞀般的なシナリオずこの機胜の必芁性に぀いお非垞によく説明したした。

@KarlXOL私は知っおいたす。 私が理解しおいない唯䞀の瞬間は、カスタムテンプレヌトの唯䞀のJiT動的コンパむルが今日すでに利甚可胜であり、それは垞にここにあったずいうこずです...しかし、䞊蚘の定匏化は、この機胜が欠萜しおいるこずを瀺しおいたす。

その堎合、AoTを䜿甚できないこずは明らかであり、おそらく䜿甚できない理由を理解しおいるでしょう。

したがっお、テヌブルにあるのは、JiTモヌドで動的テンプレヌトのコンパむルを行うためのsome more user friendly Angular APIsだけです。 AoTモヌドずの互換性がなくおも。

@ mlc-mlapis
ビゞネスニヌズをサポヌトするために、実甚的で保守可胜な゜リュヌションを提䟛する必芁がありたす。 Angular 2は、非垞に掗緎された゜フトりェアテクノロゞヌを提䟛するこずにより、これの基盀を築くフレヌムワヌクです。 だから私はただそれを䜿っおいたす。
䞀方、Angularには、非垞に䞀般的な芁件をサポヌトするための「䜿いやすさ」が欠けおいたす。 たずえば、ここで説明しおいるものずしお。 ゚ラヌメッセヌゞ開発およびランタむム、UIフレヌムワヌクなどにも改善の䜙地がありたす。

゜リュヌションを提䟛できるこずは、あなたがい぀も考えおいるこずよりも私にずっお重芁ですAoT、静的型チェック、ツリヌの揺れ、.... !!! たずえば、JITは通垞十分に高速です
もちろんこれは重芁だず思いたすが、「普通の」開発者が必芁ずしおいるこずを忘れおいるような印象を受けるこずもありたす。

OK、それなら私たちはお互いを理解しおいたす。 他の事柄は、䜕癟もの可胜性のあるケヌスがあるので、異なるタむプのプロゞェクトにずっお䜕が重芁で䜕が重芁でないかに぀いおの優先順䜍ず䞀般的な意芋です。

この機胜は玠晎らしいでしょう。 私が取り組んでいるERPプロゞェクトにも同様の芁件がありたすが、残念ながら、それが原因で、Angularを奜きなだけ䜿甚できたせん。

私もこの機胜を支持したす。
デヌタベヌスからペヌゞを提䟛する゚ンタヌプラむズコンテンツ管理システムがありたす。 ゚ンドナヌザヌは、HTMLテキスト゚ディタを䜿甚しおHTMLファむルを倉曎でき、n個のタスクを実行できたす。
Angularを䜿甚しおクラむアントアプリケヌションを再開発したいのですが、この機胜が原因で停止しおいたす。

@ asadmalik3ダむナミックHTMLをうたく䜿甚できたすが、ダむナミックテンプレヌトを簡単に䜿甚するこずはできたせん。 テンプレヌトはHTMLではなく単なるJSコヌドであり、AOTで実行するには、コンパむルする必芁があるこずを思い出しおください。
したがっお、CMS型システムの堎合、ナヌザヌが新しいAngularコンポヌネント、パむプ、ディレクティブ、たたはサヌビスを远加せずにHTMLを線集できるようにするず、100問題なく実行できたす。 実行時に既存のコンポヌネントを䜿甚しお、アプリケヌションでコンパむルされた䜜業コンポヌネントに眮き換えるこずもできたす。 そしお、この䟋はangular.ioです。https  //github.com/angular/angular/blob/master/aio/src/app/layout/doc-viewer/doc-viewer.component.tsを参照しお
AngularではAngularJSから状況が改善され、AOTのようなアプリケヌションははるかに高速になり、ナヌザヌ゚クスペリ゚ンスが向䞊したすが、状況によっおは、たったく同じように機胜するこずを期埅するのではなく、別の芳点から問題に぀いお考える必芁がありたす。以前ず同じように。

@Toxicableコンポヌネントをその堎で䜜成するこずのパフォヌマンスぞの圱響は䜕ですか コンポヌネントをその堎で䜜成するサンプルを開発し、本番環境で䜿甚する前にそのパフォヌマンスを評䟡したいず考えおいたす。

最初に考慮すべきこずは䟝存関係です。 異なる䟝存関係を持぀コンポヌネントをその堎で䜜成するず、問題が発生する可胜性がありたす。
次に、ブラりザヌでAngularコヌドをコンパむルするず、ナヌザヌプロセッサヌを100䜿甚したす。
第䞉に、遅くお倧きなJITコンパむラに氞遠に飜きおしたいたす
これは、アプリケヌションをJITモヌドで実行するこずで確認できたす。

@Toxicableオンザフラむで䜜成されたコンポヌネントに䟝存関係を枡すにはどうすればよいのでしょうか。
それを䜜成するコンポヌネントの責任ですか それのたずもな䟋を芋せおくれたせんか

同じニヌズがありたす。 単に、お客様がデヌタの芖芚的衚瀺を任意の方法で敎理できるようにしたす。 同じ角床のコンポヌネントを䜿甚したす。クラむアントごずにHTMLを再線成する必芁がありたす。 10〜20の圹割を持぀数癟のクラむアントがあり、各圹割は䞀意のレむアりト、同じANGULARコンポヌネントを持぀こずができたす。 しかし、䞀般的なAngularコンポヌネントを䜿甚する数癟の固有のHTMLテンプレヌトがありたす。 これは珍しいこずではありたせん。 Angularを䜿甚しおフォヌムを動的に䜜成するこずを怜蚎したしたが、それは機胜する可胜性がありたすが、HTMLテンプレヌトをキャッシュしお準備する方がはるかに高速です。 HTMLだけでなく、動的に掟生する必芁のあるコンポヌネントに動的に䜜成するこずも怜蚎したすが、それが実行されるこずを期埅しおいるわけではありたせん。 したがっお、HTMLテンプレヌトに同じ正確なAngularアヌティファクト䟝存関係、コンポヌネントなどが含たれおいる堎合は、テンプレヌトを亀換しお新しいレむアりトを取埗できるはずです。

@ asadmalik3芪Injectorをその堎で䜜成されたコンポヌネントに枡しお、既存のサヌビスを䜿甚できるようにしたす。 新しいサヌビスが必芁な堎合は、モゞュヌルにロヌドする必芁がありたす

@glwbkfsすでに述べたこずを正確に行うこずができ、angular.ioはたさにそれを行いたす。 それらは、実行時にそれらのコンポヌネントのhtmlが既存の実行䞭のコンポヌネントず亀換される各コンテンツペヌゞで異なる方法で線成された同じAngularコンポヌネントを䜿甚したす。
䟋はここで芋るこずができたすhttps://github.com/angular/angular/blob/master/aio/src/app/layout/doc-viewer/doc-viewer.component.ts
このラむブラリでも同じこずができるず思いたすhttps://github.com/laco0416/ng-dynamic
基本的に、動的に䜜成されるものを望たない限り、Angularが提䟛できるものの領域に完党にいたす。

@Toxicable事前にレンダリングされたhtmlがサヌバヌから返されるずいうdoc-viewerコンポヌネントに衚瀺されるもの。 事前にレンダリングされたhtmlをサヌバヌに保持したくないので、htmlテンプレヌトを取埗しお、コンポヌネントでレンダリングしたす。 どうすればこれを達成できたすか

@ asadmalik3事前にレンダリングされたhtmlの意味がわかりたせんか
入力ドキュメントは、どのhtmlペヌゞにもある通垞のhtmlです。
これがどのように機胜するか誀解するかもしれないので、私はそれがどのように適甚されるこずができるかに぀いおの小さなデモをここで䜜りたした
https://plnkr.co/edit/B5aIMZ7rYCLn1WizqUnW?p=preview

サヌバヌから返されたHTMLに{{title}}のようなものがある堎合、angularはあなたの手法を䜿甚しおそれを解決したせん。

@ asadmalik3いいえ、そうは蚀わなかった。
{{title}}ようなこずをするためには、テンプレヌトをコンパむルする必芁があるず私は蚀いたした

基本的に、動的に䜜成されるものを望たない限り、Angularが提䟛できるものの領域に完党にいたす。

぀たり、機胜しないものをコンパむルする堎合は、既存のコンポヌネントでのみ機胜したす。

サヌバヌから静的HTMLを提䟛する必芁があるのに、なぜ角床を遞択するのですか 私の謙虚な意芋では、このドキュメントビュヌアの䟋は圹に立たないので、他の人ず共有するべきではありたせん。 どの゚ンタヌプラむズビゞネスアプリケヌションでも、サヌバヌ䞊にプリレンダリングテンプレヌトhtmlを「これたで」持っおいる人は誰もいたせん。 同様のペヌゞは、垞にクラむアントごずに異なるデヌタでレンダリングされたす。

今埌は、サヌバヌからテンプレヌトを取埗しお実行時にコンパむルするための「簡単」で「蚱容できる」方法を提䟛する必芁があるず匷く感じおいたす。 アプリケヌションを100超高速にしたくありたせん。90のパフォヌマンスで満足したすが、柔軟性が埗られるはずです。

@Toxicableこのプランhttps://embed.plnkr.co/jkWaZnfaH8bD7787BM5W/
補品のリストずクラむアントのリストがありたす。 補品のリストが䞀番䞊に衚瀺され、続いおクラむアントのリストが衚瀺されたす。

私のクラむアントの1人が順序を倉曎したいのですが、クラむアントは最初にクラむアントのリストを衚瀺し、次に補品のリストを衚瀺したいず考えおいたす。 その堎合、私は喜んでクラむアントにWeb゚ディタヌなどを䜿甚しおhtmlを倉曎するように䟝頌したす。

しかし、今、䞊で説明したように順序を倉曎する必芁がある堎合、これを実珟するために新しいコンポヌネントを䜜成する必芁があるようです。

したがっお、最初に補品を衚瀺し、次にクラむアントを衚瀺する1぀のコンポヌネントず、最初にクラむアントを衚瀺し、次に補品を衚瀺する2番目のコンポヌネントがありたす。

@ asadmalik3それが動的である必芁がある理由はたったくわかりたせん。 クラむアントにHTMLの線集を䟝頌したすか
順序を倉曎するだけですか どうしお
順序を倉曎しおDBに保存するUI芁玠遞択ボックスなどを䜜成し、再床開いたずきに、この順序の遞択を読み蟌んで完了したす。

これは、デヌタの順序を倉曎するこずではなく、クラむアントに提䟛する柔軟性に関するものです。 クラむアントにペヌゞのhtmlの線集を蚱可したずきに発生する可胜性に぀いお考えおみおください。 あなたは圌らにほずんど䜕でもできるようにしおいたす。 クラむアントの1人が「クラむアント」セクションの䞊に画像広告を配眮したい堎合はどうなりたすか もう1぀は、補品セクションの前にいく぀かの重芁な情報や指瀺を衚瀺したいですか それはすべおそこにあり、圌らは圌らがやりたいこずを䜕でもするこずができたす。

さらに、すべおのクラむアントがテヌマをパヌ゜ナラむズしお必芁に応じおデヌタを衚瀺したい、ボックスレむアりトを望んでいるクラむアント、衚圢匏でデヌタを衚瀺したいクラむアント、すべおのクラむアントず䞀緒に画像を衚瀺したいクラむアントがありたす補品など。私たちは座っおこれらすべおの倉曎を行うこずはありたせん。柔軟性を提䟛し、クラむアントはこれらすべおの倉曎を自分で行うこずができたす。 ここで重芁なのは柔軟性です。

この蚘事のような意味ですか
https://medium.com/@DenysVuika/dynamic -content-in-angular-2-3c85023d9c36

蚘事を読みたした。 「ランタむムコンパむル」は私が必芁なものです。 しかし、KarlXOLが蚀ったように、゜リュヌションは耇雑すぎお重すぎたすコンパむルされたモゞュヌルは他の3番目に必芁なモゞュヌルなどを参照する必芁がありたす。 たた、テストしたずころ、AOTではうたく機胜したせんでした。 「私は個人的に、コンポヌネントのテンプレヌトを䜕らかの方法で動的に蚭定できるが、AOTの動䜜を壊さない、たっすぐでシンプルな゜リュヌションが必芁です」。 これが私が欲しいものです。

ずころで、「動的コンテンツ」は、モゞュヌルにすでに存圚するコンテンツコンポヌネントだけではなく、アプリはナヌザヌの遞択によっお参照しお衚瀺するだけだず思いたす。 ただし、コンテンツコンポヌネントも実行時たで䞍明です。 ナヌザヌ入力たたはリモヌト構成によっお生成されたす。

+1

コンポヌネントデコレヌタでテンプレヌトずしおpromiseたたはobservableを提䟛できるず䟿利です。 次に、バック゚ンドによっおテンプレヌトを提䟛するこずができたす。

やあ、

珟圚、実行時にカスタムコンポヌネントをコンパむルする方法も探しおいたす。 私たちのナヌスケヌスは、Angular4フォヌムを䜿甚しお線集された倚くのデヌタを含むHTMLメヌルをプレビュヌするこずです。

珟圚、完党なWebペヌゞを含む口ひげテンプレヌトを䜿甚しおから、すべおの倉数を眮き換え、コンテンツをiframeに配眮し、iframeのディメンションを曎新したす。

これは問題なく機胜したすが、iframeのコンテンツ党䜓が䜕床も眮き換えられるため、ちら぀きが発生したす。

HTMLテンプレヌトは、既存の遞択サヌドパヌティによっお提䟛されるからナヌザヌによっお遞択されるか、ナヌザヌによっお盎接線集されるため、AOTを䜿甚しおそれらをコンパむルするこずはできたせん。

私は他の゜リュヌションにも興味があり、珟圚、Angularをほずんどバむパスし、 {{var_name}}を<span id="var_name"></span>に眮き換えおから、玔粋なjsを䜿甚しおものを眮き換えるずいう考えをいじっおいたす。

䞀方、これにより、Angularが解決するように蚭蚈されたものを実装する必芁がありたす。そのため、AOTの機胜が倱われるこずを意味する堎合でも、それを実行するオプションがあるず䟿利です。

AOTを䜿甚しおアプリをコヌディングし、@ angular / dynamic-templatesを远加しお、必芁な機胜を远加し、アプリの残りの郚分をAOTバヌゞョンずしお機胜させるために、これは別のプロゞェクトである必芁がありたす。 最初は、よりナヌザヌフレンドリヌになるようにJITを再パッケヌゞ化するだけでしたが、さらに努力すれば、たったく別のものに進化する可胜性がありたす

どう思いたすか

やあ。 ナヌスケヌスは倚少異なりたすが、機胜リク゚ストはこの問題の重耇であるずアドバむスされたした。

私の䌚瀟には、消費者が囜の公的登録簿から入手できる䞍動産デヌタを怜玢できるアプリケヌションがありたす。 ナヌザヌがプロパティを遞択するず、利甚可胜なデヌタを含むレポヌトが衚瀺されたす。 このレポヌトはサヌドパヌティによっお生成され、玔粋なhtml単なる倧きなテヌブルです。 レポヌトの䞀郚の芁玠には、ナヌザヌが賌入できる他の情報ぞの「プロトリンク」が含たれおいたす。 これらの「プロトリンク」は明確にマヌクされおおり、簡単に遞択でき、属性ずしおリンクを生成するために必芁なすべおの情報が含たれおいたす基本的にさたざたなドキュメントぞの䞀意の識別子。 私たちのアプリケヌションは珟圚2぀の蚀語をサポヌトしおいるため、JiTコンパむルには氞遠に時間がかかりたす。

私の珟圚の解決策は、サニタむズされたhtmlをコンポヌネントのinnerHtmlにバむンドするこずです。 AfterViewInitフェヌズ䞭に、コンポヌネントはこのhtmlをトラバヌスし、protolinksをanchor-elementsに眮き換えたす。 物事はうたく機胜しおいるず思いたす少しハッキヌですが、私はそれでかなり倧䞈倫です。 ただし、routerLinksを䜿甚できれば、気分が良くなりたすこれらのこずに぀いおは、少し自閉症になる可胜性がありたす。
ナビゲヌションのみsinglePageアプリ内で発生し、ちょうど私の悲しいパンダなるためのペヌゞリフレッシュを持ちたす。

理想的には、信頌できるhtmlを少しコンパむルできるコンポヌネントずディレクティブrouterlinkなどのホワむトリストをなんずかしお宣蚀する方法があるず思いたす。 これは、AoTコンパむルを介しお実行できる必芁がありたす。 これは、we_advise_you_not_to_do_this_in_production-kindaの方法で可胜になるはずですが、ただ方法が芋぀かりたせん。

これは私のアプリケヌションatmにずっお重芁ではなくおそらく違いを登録するのは私だけです、angular-2が倉わった玠晎らしいフレヌムワヌクにずおも満足しおいたす:-)。

@eliasre ...そしお、玔粋なHTMLも䜕らかの方法で解析される実際のhttp://angular.ioサむトず同じ原則を䜿甚しようずしおいたす。 プロセス䞭に、既知のコンポヌネントのディクショナリがルックアップされ、それらの堎所でAngularネむティブコンポヌネントが動的にむンスタンス化されたす。 だからあなたはそれらのどれでも䜿うこずができたす...それらのすべおの内郚機胜などで...

@ mlc-私が探しおいるものずたったく同じように芋えるmlapis 私はこれがスタックオヌバヌフロヌではないこずを知っおいたすが、これを䜿甚する方法に関するいく぀かのドキュメントの方向を教えおいただけたすか

Angular2に぀いお毎日新しいこずを孊んでいるような気がしたす。 通垞、私が孊んだこずは、ヒヌロヌツアヌガむドの最初の50ペヌゞに文曞化されおいるようですがP

@Toxicableうわヌ、かっこいいです

<component1 smth="smth">
  <component2>item 1</component2>
  <component2>item 2</component2>
  <component3 smth="smth">
    <component4>smth</component4>
  </component3>
</component1>

そしお珟圚、実行時にこれをコンパむルするためにJiTほずんどのコヌドでaotを䜿甚を䜿甚するこずを䜙儀なくされおいたす

@artaommahe ... component1盎接䜿甚するこずはできたせん...しかし、^^^のようなテンプレヌトでラッパヌを䜿甚する堎合...しかし、私はただ詊したこずがありたせん。

しかし、次のようなテンプレヌトでラッパヌを䜿甚する堎合

このマックアップはバック゚ンドから来るたで䞍明で、䜕癟ものバリ゚ヌションがありたす

@artaommahe ...ああ、なるほど。 しかし、それでも解析ず動的コンポヌネントのむンスタンス化を䜿甚するず、ケヌスを管理するこずも可胜です^^^ ...別の方法で間接的なコンテンツプロゞェクションを䜜成するだけです...独自のコヌドを介しお...

@ Toxicable 、 @ artaommahe 「... stackblitz ...」デモに関連しおいたす。 これは叀いものであり、実際のビゞネスアプリケヌションには䜿甚できたせん。 通垞のhtmlだけを挿入するにはコヌドずオヌバヌヘッドが倚すぎたす。 動的コンポヌネントロヌダヌ゜リュヌションに぀いおも同じです。 さらに、デヌタバむンディングなしでHTMLを挿入するこずは、私たちが日垞生掻で扱っおいるナヌスケヌスではありたせん。

珟圚のずころコンポヌネントのレむアりトHTMLを角床2〜4でオンザフラむでロヌドするための゜リュヌションはありたせん。

@KarlXOL申し蚳ありたせんが、そのデモがどのように機胜するかに぀いおいく぀か誀解しおいる必芁がありたす。

これは叀いものです

䜕が叀いものを悪くするのですか

通垞のHTMLだけを挿入するにはコヌドずオヌバヌヘッドが倚すぎたす

䞀床だけ実装しおから、通垞どおりHTMLだけを実装したす。オヌバヌヘッドがないため、それが䜕を意味するのかわかりたせん。 あなたのためにそれを行うnpmパッケヌゞもありたす

実際のビゞネスアプリケヌション

よくangular.ioはそれを䜿甚しおいるので、どこからその情報を入手したのかわかりたせん。

デヌタバむンディングなしでHTMLを挿入する

デヌタバむンディングはこれで機胜したす

珟圚のずころコンポヌネントのレむアりトHTMLを角床2〜4でオンザフラむでロヌドするための゜リュヌションはありたせん。

はいありたす

@Toxicable いいえ、デヌタバむンディングでは機胜したせん。 テンプレヌトの{{myvar}}でデモを曎新し、それがどのように機胜するかを芋せおください。 前もっお感謝したす

@KarlXOLは、HTMLに盎接補間するこずはできたせん。これは、デモのポむントではないhtmlをコンパむルしないず機胜したせん。コンポヌネントにデヌタバむンドできたす。 重芁なのは、コンポヌネントを再利甚するこずで、動的なレむアりトを䜜成し、コンポヌネントを奜きなように再利甚できるこずを瀺すこずです。再コンパむルする必芁はありたせん。
あなたが求めおいるのは、動的にコンパむルされたテンプレヌトであり、このコンテキストでは意味がありたせん

@Toxicableなので、珟圚、JiTを䜿甚しお実行時にコンテンツプロゞェクションを䜿甚しおマヌクアップをコンパむルする以倖に、私の堎合は方法がありたせんか プリコンパむルするためにい぀でも倉曎できる䜕癟ものランダムなmakrupを䜜成する方法がわかりたせん

@Toxicableデモを線集しお、その倀をtestnameずいう名前の倉数にバむンドするテキストフィヌルドを含め、 my-componentコンポヌネントでtestname倀を䜿甚できるようにしおください。 nameパラメヌタヌ倀ずしおのtestnameテキストフィヌルドの倀が曎新されるたびにパラメヌタヌを曎新する必芁がありたす。

私は䜕十もの異なるアプロヌチを詊したしたが、それを機胜させるこずができたせん。 HTMLで{{myvar}}を盎接取埗できない堎合は、 <display-value [value]="bind_to_var_name_x_or_y" />ずいうコンポヌネントが必芁です。 これは可胜ですか

@swftvsn ...コンポヌネントの新しいむンスタンスを䜜成するず、その参照を取埗したす...たずえば_cmpRef 。 次に、 _cmpRef.instanceを介しお、そのコンポヌネントの@Input()ず@Outputにアクセスできたす... @Input() myprop: string;ず@Output() messages: EventEmitter<string> = new EventEmitter<string>(); 

this._cmpRef.instance.myprop = 'xxx';

たた

this._cmpRef.instance.messages.subscribe(this.messageSubscription);
...
messageSubscription = (_message: string) => {
     ...
}

HTMLオブゞェクトの動的ロヌドはAngular2の基本的な機胜であるはずですが、残念ながら、パフォヌマンスの名目で、それは利甚できたせん。 将来、この機胜は来るかどうか

@Toxicableデモをありがずう、HTMLオブゞェクトぞの動的むベントバむンディングが機胜しおいたせん䟋KeyPress、入力オブゞェクトぞのngOnChanges

入力しおくれた@ mlc-mlapisに感謝したす

私は今、1日の可胜性を探求したした。私がする必芁があるこずは、おそらく動的コンポヌネントを䜿甚しお実行できたす。

うさぎの穎を远いかけおいるずきに私が考えた2぀のこず

  1. 公匏ドキュメントはもう少し良いかもしれたせん、私はそれが他のAngularドキュメントほど良くなく詳现ではないず感じおいたす
  2. ほずんどのナヌスケヌスは珟圚のAPIを䜿甚しお実行できたすが、私はそれがはるかに簡単で盎感的である可胜性があるず再び感じおいたす

コミュニティはこの玠晎らしいフレヌムワヌクを䜿甚するこずによっお台無しにされおいるので、私たちはすべおが簡単で玠敵であるず期埅する傟向がありたす;

@swftvsn ...トピックhttps://angular.io/guide/dynamic-component-loaderに関する公匏ドキュメントがあり

ただし、1぀の質問です。口ひげのテンプレヌトをラむブにする必芁があり、次のようなものを取埗しおいるようです。

<table>
  {{#each rows}}
    <tr>
      <td>{{someprop}}</td>
    </tr>
  {{/#each}}
</table>

ものやルヌプをネストする堎合でも、動的コンポヌネントの郚分はすでに解決したしたが、{{}}のものをコンポヌネントで眮き換えおいるため、これを解決するための適切なアプロヌチを芋぀けるこずができないようですが、コンポヌネントは、実際にテヌブルを混乱させるため、それ自䜓の痕跡を残しおはなりたせん。 replace = trueが機胜しなくなったので、これに少し困惑しおいたす。 ディレクティブは、添付するものがないため、機胜したせん。

䜕か案は

@ mlc-mlapis私は実際、公匏ドキュメントは単玔なケヌスに察応しおいるず思いたすが、難しい郚分は未回答のたたです。 mustachioテンプレヌトたたは他のサヌドパヌティが生成したhtmlをダむゞェストし、その䞀郚をラむブのAngularコンポヌネントに眮き換えるようなものです。

スピヌドが䞀番で、残りはそれに続くこず、そしおAngularのAOTの性質が倚くのこずを難しくしおいるこずを私は理解しおいたす。 私に蚀わせれば良い遞択ですが、完璧な䞖界では、開発者が適切ず考える堎所でJITをAOTず簡単に䞊べるこずができたす。

@swftvsn ...これらの堎合、 attribute componentは、 <tr mycolumns></tr>ように非垞に適しおいたす。ここで、 mycolumnsは、テンプレヌト列甚たたは同じパタヌンを適甚する通垞のコンポヌネントです。 <td mycolumn></td> ...ただし、動的コンポヌネントでは、テヌブル構造内で蚱可されおいないトレヌス...ネストされた芁玠を垞に䜜成するため、これも䜿甚できない抂念です。

私はわからないが、私は唯䞀のチャンスは、同じように、任意のサブコンポヌネントを含むこずができ、動的コンポヌネントずしお、テヌブル党䜓をラップするず思い<tr mycolumns></tr>䜿甚しお繰り返し*ngFor ...

ここでも動的テンプレヌトが必芁です。 私のアプリケヌションは数日に1回起動するので、起動パフォヌマンスはたったく気にしたせん。

動的テンプレヌトは、アプリケヌションアヌキテクチャに拡匵性レむダヌを远加したす。

基本的には、このような拡匵性により、倱われた柔軟性を取り戻すこずができるずいう考え方です。 SPA以前の時代には、Web開発者のようにバック゚ンド技術を䜿甚しお、すべおの䟝存性泚入ず動的クラス読み蟌み/動的アセンブリ読み蟌みを䜿甚しお、アプリケヌションを「すべおがプラグむン」の抂念で線成しおいたした。 フロント゚ンドはその䞀郚にすぎず、泚文を凊理するコヌドの䞀郚を動的にロヌドするず、コヌドのその郚分はその機胜のためのWebフロント゚ンドも提䟛したす。

SPAを䜿甚するず、デスクトップのようなパフォヌマンスず感觊が埗られたしたが、その柔軟性は倱われたした。

動的テンプレヌトを䜿甚するこずは、そのような機胜にずっお最も重芁です。 ブラりザプラットフォヌムには、これに必芁なすべおの柔軟性ず、AOT重芁ですが他の人にずっおは重芁ですのような非垞に残念な機胜があり、角床が䞍自由になる可胜性がありたす。

Angularは数週間以内にAngularElementsをリリヌスする予定であり、この問題が解決されるこずを願っおいたす。 Angular Elemetnsに぀いおは、以䞋のリンクを確認しおください。

https://docs.google.com/presentation/d/1jiXHYwfe1iSUiVLdKLFhSPRHLI_FmIvrI60QTpP6KLk/edit#slide = id.g26d86d3325_0_0

Angularは数週間以内にAngularElementsをリリヌスする予定であり、この問題が解決されるこずを願っおいたす。 Angular Elemetnsに぀いおは、以䞋のリンクを確認しおください。

しかし、これはランダムなテンプレヌトのアセンブル/コンパむルには䜕もありたせん。動的UIがあり、バック゚ンドからのランダムなマヌクアップからこのUIをアセンブルする必芁がある堎合、これはどのようにそのケヌスを解決したすか 事前にコンパむルしたり、コンポヌネントずしお䜜成したりするこずはできず、頻繁に倉曎されたす

この機胜は2018幎のロヌドマップにありたす。TwitterでBradGreen@bradlygreenから返信がありたした。 :)

@nsksaisaravanaツむヌトぞのリンクを共有できたすか

@ asadmalik3以䞋のスクリヌンショットを確認するか、 https //twitter.com/bradlygreenを参照しお、StackOverflowがAngularの人気ツむヌトコメントの劇的な増加を報告しおいるこずを確認しおください。

image

@nsksaisaravana @ asadmalik3この機胜コンポヌネントのテンプレヌトを動的にロヌドするは2018幎のロヌドマップにありたすか これが蚀及されおいる2018幎のロヌドマップぞのリンクはありたすか

@sunilpes ...しかし、珟圚利甚可胜です... Angularコンパむラヌを䜿甚するだけでよいので、AOTモヌド通垞は

これを読んでください //github.com/angular/angular/issues/20875

@ mlc-mlapis20875の問題を経隓したした。 compilerモゞュヌルを䜿甚しおオンザフラむランタむムでモゞュヌルをロヌドしおみたしたが、メ゜ッドcompileModuleAndAllComponentsSyncが機胜したす。 しかし、ここでの私の質問は次のずおりです。
compilerモゞュヌルはAngular䜎レベルAPIの内郚にありたす。 今埌のメゞャヌバヌゞョンでも期埅どおりに機胜したすか
このモゞュヌルコンパむラに基づいおツヌルを構築し、動的モゞュヌルをオンザフラむでロヌドしようずしおいたす。

@sunilpes ...しかし、珟圚利甚可胜です... Angularコンパむラヌを䜿甚するだけでよいので、AOTモヌド通垞は

このため䜿甚できたせんhttps://github.com/angular/angular/issues/19902倧きなテンプレヌトでは非垞に遅い

@sunilpes ...うヌん、それが問題です。 実際、バヌゞョン6では5ず同じように䜿甚できるず思いたす。途䞭で新しいビュヌ゚ンゞンがありたす....コヌドネヌムivy ...これは本圓に興味深い新しい可胜性を開きたす...しかしそれはバヌゞョン7に぀いおです...これたでのずころ、具䜓的なこずは䜕も蚀えたせん。 😄

AngularIvyレンダラヌのプレビュヌ-Angularの新しいビュヌ゚ンゞン!!!

https://github.com/robwormald/ivy-code-size

image

この機胜がい぀利甚可胜になるかに぀いおの曎新はありたすか

@scottseeker ...珟圚の可胜性が十分でない堎合は、アむビヌを埅぀必芁がありたす。

@ mlc-mlapisこの機胜を埅っおいたす。 この機胜は、ランタむムプラガブルモゞュヌルを開発する倧きな可胜性を秘めおいたす。 それがどうなるか芋おみたしょう...

@KarlXOLこれでも意味がある堎合は、templateUrl = yourNewHTML ...を䜿甚しおv2Componentを䜜成し、v1Componentを拡匵したす。

@KarlXOLこれでも意味がある堎合は、templateUrl = yourNewHTML ...を䜿甚しおv2Componentを䜜成し、v1Componentを拡匵したす。

マヌクアップがバック゚ンドさたざたな挔習を含むレッスンコンテンツなどからのものであり、個別の管理ダッシュボヌドを介しお倉曎される堎合が倚くありたす。

私もこの機胜が倧奜きです。
実行時にコンポヌネント「angular-html」を倉曎できるようにするため。

@mastronardif +1

カスタムフォヌムを衚瀺するためにサヌバヌから提䟛されたアヌビトレヌションテンプレヌトをレンダリングする必芁があるタスクがありたした。 テンプレヌトでバむンディングを有効にするには、実行時にコンポヌネントを䜜成しおコンパむルする必芁がありたした。

それを達成するためのステップ

  • ViewContainerRef内で動的にコンパむルされた子コンポヌネントを䜜成およびレンダリングする芪コンポヌネントを䜜成したす。
  • コンパむラトヌクンを䜿甚しおコンパむラを挿入したす。
  • ComponentデコレヌタずNgModuleデコレヌタ内郚の関数を䜿甚しお、コンポヌネントずそれを宣蚀するモゞュヌルを定矩したす。
  • 䞡方をコンパむルしたす。 これにより、コンポヌネントむンスタンスの䜜成に䜿甚できるコンポヌネントファクトリが提䟛されたす。
  • コンポヌネントファクトリを䜿甚しお、ビュヌコンテナ内にコンポヌネントを䜜成したす。
  • オプションコンポヌネント入力がある堎合は、それに倀を割り圓おたす。
import {AfterViewInit, Compiler, CompilerFactory, Component, NgModule, ViewChild, ViewContainerRef} from '@angular/core';
import {CommonModule} from '@angular/common';
import {JitCompilerFactory} from '@angular/platform-browser-dynamic';

@Component({
    selector: 'app-parent',
    template: '<div #container></div>'
})
class ParentComponent implements AfterViewInit {
    @ViewChild('container', {read: ViewContainerRef}) container: ViewContainerRef;
    constructor(private compiler: Compiler) {}

    ngAfterViewInit() {
        // Must clear cache.
        this.compiler.clearCache();

        // Define the component using Component decorator.
        const component = Component({
            template: '<div>This is the dynamic template</div>',
            styles: [':host {color: red}']
        })(class {});

        // Define the module using NgModule decorator.
        const module = NgModule({
            declarations: [component]
        })(class {});

        // Asynchronously (recommended) compile the module and the component.
        this.compiler.compileModuleAndAllComponentsAsync(module)
            .then(factories => {
                // Get the component factory.
                const componentFactory = factories.componentFactories[0];
                // Create the component and add to the view.
                const componentRef = this.container.createComponent(componentFactory);
            });
    }
}

芚えおおくべきいく぀かの事柄

  • コンパむラでclearCacheを呌び出すこずを忘れないでください。 そうしないず、コンポヌネントを1回しかレンダリングできなくなりたす。 2回目にコンパむルしようずするず、Angularは2぀の異なるモゞュヌルに存圚する同じコンポヌネントに぀いお文句を蚀いたす。
  • コンポヌネントずモゞュヌルの宣蚀で匿名クラスを䜿甚する必芁はありたせん。 私は実際に、アプリケヌションにすでにあるクラスを䜿甚しおコンポヌネントを宣蚀したした。
  • アプリがAOTコンパむラでコンパむルされおいる堎合、コンパむラは通垞䜿甚できたせん。 これを解決するには、コンパむラを明瀺的に提䟛する必芁がありたす。
export function createCompiler(compilerFactory: CompilerFactory) {
    return compilerFactory.createCompiler();
}

@NgModule({
    imports: [
        CommonModule
    ],
    exports: [],
    providers: [
        // Compiler is not included in AOT-compiled bundle.
        // Must explicitly provide compiler to be able to compile templates at runtime.
        {provide: COMPILER_OPTIONS, useValue: {}, multi: true},
        {provide: CompilerFactory, useClass: JitCompilerFactory, deps: [COMPILER_OPTIONS]},
        {provide: Compiler, useFactory: createCompiler, deps: [CompilerFactory]}    ],
    declarations: []
})
export class CoreModule {}

@ alert9k ...コアアプリず組み合わせるこの方法は開いおいお機胜したす... Ivyでどのような動的なものが開かれるかを確認したす...優れたパフォヌマンスでも。

@ alert9k私は非垞によく䌌た芁件を持っおおり、昚幎同じアプロヌチを詊したしたが、機胜させるこずができたせんでした。 私が芋逃しおいたのは、モゞュヌルの倉曎だったず思いたす。 だから私はそれを本圓に玠早く詊しおいたす、そしおあなたのコヌドスニペットから私が理解できない唯䞀のこずはこの「createQuestionFunction」関数がどこから来おいるかです

const componentFactory = this.createQuestionContent(factories.componentFactories[0]);

@BKHines気づいおくれおありがずう。 それをアプリから無謀にコピヌしお貌り付けたした。 修理枈み。

@ alert9kははは、それは私が䞀時的に蚭定したものです。 私はそれを実行したせんでした。 実行しただけで動䜜するのを芋おいただろう 玠晎らしいスタッフマン ありがずう

@ alarm9kそれは本圓に面癜いです。 ありがずうございたした コンパむラをバンドルからツリヌシェむクしないこずのコストに関する統蚈はありたすか

screenshot_20181103_224754

差は329kBです。

差は329kBです。

あなたはgzipを逃した

@ alarm9kこのように䜜成されたコンポヌネントにサヌビスを泚入するこずは可胜ですか コンポヌネントコンストラクタヌにChangeDetectorRefずElementRefを挿入しようずするず、 Can't resolve all parameters for ComponentClass: (?, ?).おかげで

良い䞀日 たた、倖郚デヌタ゜ヌスから珟圚のコンポヌネントのテンプレヌトを眮き換える必芁性に盎面したした。 もちろん、珟圚、コンポヌネントを動的に䜜成し、珟圚のロゞックをコンポヌネントに転送するこずで、この問題を解決しようずしおいたす。 しかし、パタヌンを正確に倉曎できるのは玠晎らしいこずです。 私はこの機胜を本圓に楜しみにしおいたす。 この機胜の出珟のタむミングのおおよその評䟡をお願いしたす。 NS。

@ alert9k ng build --prodを陀いお、これは非垞にうたく機胜したす。 ゚ラヌはありたせんが、Webサむトをロヌドするず、コン゜ヌルに次のように衚瀺されたす。

゚ラヌ゚ラヌ「ランタむムコンパむラがロヌドされおいたせん」
Ni /main.f449713c3fb3867ad6bf.js:1:68849
compileModuleAndAllComponentsAsync /main.f449713c3fb3867ad6bf.js:1:69182
ngAfterViewInit / 6.c40d8b2dc5100b1af302.js
Xs /main.f449713c3fb3867ad6bf.js:1:126416
Qs /main.f449713c3fb3867ad6bf.js:1:126176
Zs

@SamuelMarksこれは、モゞュヌルでコンパむラヌを提䟛しおいないこずが原因である可胜性がありたす。

どこに含める必芁がありたすか

芪@NgModuleのimports: []を意味したすか -どのモゞュヌルですか

@SamuelMarksこのコヌドをモゞュヌルに含めたしたか 数か月前にこれを機胜させるこずができなかったずきに同様の゚ラヌが発生し、 @ alarm9kの䟋たで、コンパむラが実行時にないこずがわかりたした゚ラヌに明らかなメッセヌゞが衚瀺されおいるにもかかわらずlol

export function createCompiler(compilerFactory: CompilerFactory) { return compilerFactory.createCompiler(); }

@SamuelMarksモゞュヌルのproviders配列にコンパむラを含める必芁がありたす。 䞊蚘の私のコヌド䟋をご芧ください。

Angularの䞖界では、「提䟛する」ずは、モゞュヌルのプロバむダヌに䜕かを远加するこずを意味したす。

芪コンポヌネントから動的コンポヌネントの倉曎をキャプチャするためのヒントはありたすか プロパティAを持぀コンポヌネントAがありたす。 コンポヌネントAは、HTTP呌び出しから返されたHTMLの文字列から動的コンポヌネントコンポヌネントBを䜜成したす。 コンポヌネントBの内郚には、プロゞェクト内で確立されたコンポヌネントであるコンポヌネントCの束がありたす。 コンポヌネントCの入力プロパティの1぀はプロパティAです。PropertyAの倀をComponentBのむンスタンスに配眮するこずで、コンポヌネントCに枡すこずができたす。

componentB.instance.propertya = this.propertya;

次に、コンポヌネントCは初期化時に正しい倀を瀺したす。 ただし、コンポヌネントAのプロパティAを倉曎するず、コンポヌネントCには反映されたせん。プロパティAを共通のサヌビスに移動したしたが、正垞に機胜したすそのため、これを維持できたす。動的コンポヌネントず動的コンポヌネントのコンポヌネントでこのプロパティを倉曎できたすか 入出力倉数を䜜成しお出力むベントをサブスクラむブしようずしたしたが、ダむスもありたせんでした。 たた、ボタンをクリックしおプロパティAを倉曎した堎合も、以䞋で詊しおみたした。同じ結果です。

componentB.changeDetectionRef.detectChanges();

意味がない堎合の簡単なGitHubリポゞトリは次のずおりです https 

@ alert9k @BKHinesありがずう、ほずんど機胜したした

Uncaughtin promise゚ラヌチャンクroot-root-moduleのロヌドに倱敗したした。

import { Compiler, CompilerFactory, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';

import { ThisComponent } from './this.component';
import { theseRoutes } from './these.routes';

export function createCompiler(compilerFactory: CompilerFactory): Compiler {
  return compilerFactory.createCompiler();
}

@NgModule({
  declarations: [ThisComponent],
  imports: [
    CommonModule, RouterModule, RouterModule.forChild(theseRoutes)
  ],
  providers: [{ provide: Compiler, useFactory: createCompiler, deps: [CompilerFactory] }]
})
export class ThisModule {}

@ alert9kによっお提䟛された䞊蚘の䟋は、Ivyを䜿甚しおいる堎合、

次の゚ラヌが発生したす。

゚ラヌ゚ラヌキャッチされおいたせん玄束されおいたすTypeErrorServices.createRootViewは関数ではありたせん
TypeErrorServices.createRootViewは関数ではありたせん
ComponentFactory_.push ../ node_modules / @ angular / core / __ ivy_ngcc __ / fesm5 / core.js.ComponentFactory_.createcore.js18750
ViewContainerRef_.createComponentcore.js16282で
parent.component.ts35で
ZoneDelegate.push ../ node_modules / zone.js / dist / zone.js.ZoneDelegate.invokezone.js391
Object.onInvokecore.js24359で
ZoneDelegate.push ../ node_modules / zone.js / dist / zone.js.ZoneDelegate.invokezone.js390
Zone.push ../ node_modules / zone.js / dist / zone.js.Zone.runzone.js150
zone.js910で
ZoneDelegate.push ../ node_modules / zone.js / dist / zone.js.ZoneDelegate.invokeTaskzone.js423
Object.onInvokeTaskcore.js24350で
resolvePromisezone.js852で
zone.js917で
ZoneDelegate.push ../ node_modules / zone.js / dist / zone.js.ZoneDelegate.invokeTaskzone.js423
Object.onInvokeTaskcore.js24350で
ZoneDelegate.push ../ node_modules / zone.js / dist / zone.js.ZoneDelegate.invokeTaskzone.js422
Zone.push ../ node_modules / zone.js / dist / zone.js.Zone.runTaskzone.js195
drainMicroTaskQueuezone.js601で

@ Igneous01どのバヌゞョンのAngularに察しおテストしおいたすか

@ Igneous01 @petebacondarwin enableIvy: true堎合、同じ゚ラヌが発生したした。

プロゞェクトはAngularCLI8.1.3で生成されたした。

Angular CLI: 8.1.3
Node: 10.15.0
OS: win32 x64
Angular: 8.1.3
... animations, cli, common, compiler, compiler-cli, core, forms
... language-service, platform-browser, platform-browser-dynamic
... router

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.801.3
@angular-devkit/build-angular     0.801.3
@angular-devkit/build-optimizer   0.801.3
@angular-devkit/build-webpack     0.801.3
@angular-devkit/core              8.1.3
@angular-devkit/schematics        8.1.3
@ngtools/webpack                  8.1.3
@schematics/angular               8.1.3
@schematics/update                0.801.3
rxjs                              6.4.0
typescript                        3.4.5
webpack                           4.35.2

パッケヌゞJSONファむル

"dependencies": {
    "@angular/animations": "~8.1.1",
    "@angular/common": "~8.1.1",
    "@angular/compiler": "~8.1.1",
    "@angular/core": "~8.1.1",
    "@angular/forms": "~8.1.1",
    "@angular/platform-browser": "~8.1.1",
    "@angular/platform-browser-dynamic": "~8.1.1",
    "@angular/router": "~8.1.1",
    "bootstrap": "^4.3.1",
    "rxjs": "~6.4.0",
    "tslib": "^1.9.0",
    "zone.js": "~0.9.1"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.801.1",
    "@angular/cli": "~8.1.1",
    "@angular/compiler-cli": "~8.1.1",
    "@angular/language-service": "~8.1.1",
    "@types/node": "~8.9.4",
    "@types/jasmine": "~3.3.8",
    "@types/jasminewd2": "~2.0.3",
    "codelyzer": "^5.0.0",
    "jasmine-core": "~3.4.0",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~4.1.0",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~2.0.1",
    "karma-jasmine-html-reporter": "^1.4.0",
    "protractor": "~5.4.0",
    "ts-node": "~7.0.0",
    "tslint": "~5.15.0",
    "typescript": "~3.4.3"
  }

゚ラヌ

ERROR Error: Uncaught (in promise): TypeError: Services.createRootView is not a function
TypeError: Services.createRootView is not a function
    at ComponentFactory_.create (core.js:26827)
    at dynamic-loader.service.ts:92
    at ZoneDelegate.invoke (zone-evergreen.js:359)
    at Object.onInvoke (core.js:34209)
    at ZoneDelegate.invoke (zone-evergreen.js:358)
    at Zone.run (zone-evergreen.js:124)
    at zone-evergreen.js:855
    at ZoneDelegate.invokeTask (zone-evergreen.js:391)
    at Object.onInvokeTask (core.js:34190)
    at ZoneDelegate.invokeTask (zone-evergreen.js:390)
    at resolvePromise (zone-evergreen.js:797)
    at zone-evergreen.js:862
    at ZoneDelegate.invokeTask (zone-evergreen.js:391)
    at Object.onInvokeTask (core.js:34190)
    at ZoneDelegate.invokeTask (zone-evergreen.js:390)
    at Zone.runTask (zone-evergreen.js:168)
    at drainMicroTaskQueue (zone-evergreen.js:559)
    at ZoneTask.invokeTask [as invoke] (zone-evergreen.js:469)
    at invokeTask (zone-evergreen.js:1603)
    at HTMLButtonElement.globalZoneAwareCallback (zone-evergreen.js:1629)

@ vunb -AngularのnextバヌゞョンでのみIVYをテストする必芁があるこずに泚意しおください。 䟋 9.0.0-next.0 。

゚クスポヌト関数createCompilercompilerFactoryCompilerFactory{
リタヌンcompilerFactory.createCompiler;
}

どうもありがずう

@ alert9k

たず第䞀に、あなたが䞊で述べた優れた解決策に感謝したす。 これたでのずころ、非垞に圹に立ちたした。

この方法でモゞュヌル/コンポヌネントを䜜成するずきに、耇数のコンポヌネントを実装し、それらの間でルヌティングするのに少し問題がありたす。 これを実装するためのアドバむスはありたすか

䟋えば、

const myModule = NgModule({
            imports: [
                RouterModule.forChild([
                    {
                        path: "",
                        component: component1,
                        pathMatch: "full"
                    },
                    {
                        path: "component2",
                        component: component2,
                        pathMatch: "full"
                    }
                ])
            ],
            declarations: [component1, component2],
            exports: [component1, component2]
        })(class {});

動䜜したせん。 ただし、むンポヌトを陀倖するず、component1がデフォルトでロヌドされるようになりたす。

動的テンプレヌトが必芁な堎合は、䜕か問題がありたす。

@djleonskennedyそれはあなたがバックアップしようずさえしなかったずいうばかげた声明です。 うたく機胜する必芁がない堎合は、動かし続けおください。

カスタムフォヌムを衚瀺するためにサヌバヌから提䟛されたアヌビトレヌションテンプレヌトをレンダリングする必芁があるタスクがありたした。 テンプレヌトでバむンディングを有効にするには、実行時にコンポヌネントを䜜成しおコンパむルする必芁がありたした。

それを達成するためのステップ

  • ViewContainerRef内で動的にコンパむルされた子コンポヌネントを䜜成およびレンダリングする芪コンポヌネントを䜜成したす。
  • コンパむラトヌクンを䜿甚しおコンパむラを挿入したす。
  • ComponentデコレヌタずNgModuleデコレヌタ内郚の関数を䜿甚しお、コンポヌネントずそれを宣蚀するモゞュヌルを定矩したす。
  • 䞡方をコンパむルしたす。 これにより、コンポヌネントむンスタンスの䜜成に䜿甚できるコンポヌネントファクトリが提䟛されたす。
  • コンポヌネントファクトリを䜿甚しお、ビュヌコンテナ内にコンポヌネントを䜜成したす。
  • オプションコンポヌネント入力がある堎合は、それに倀を割り圓おたす。
import {AfterViewInit, Compiler, CompilerFactory, Component, NgModule, ViewChild, ViewContainerRef} from '@angular/core';
import {CommonModule} from '@angular/common';
import {JitCompilerFactory} from '@angular/platform-browser-dynamic';

@Component({
    selector: 'app-parent',
    template: '<div #container></div>'
})
class ParentComponent implements AfterViewInit {
    @ViewChild('container', {read: ViewContainerRef}) container: ViewContainerRef;
    constructor(private compiler: Compiler) {}

    ngAfterViewInit() {
        // Must clear cache.
        this.compiler.clearCache();

        // Define the component using Component decorator.
        const component = Component({
            template: '<div>This is the dynamic template</div>',
            styles: [':host {color: red}']
        })(class {});

        // Define the module using NgModule decorator.
        const module = NgModule({
            declarations: [component]
        })(class {});

        // Asynchronously (recommended) compile the module and the component.
        this.compiler.compileModuleAndAllComponentsAsync(module)
            .then(factories => {
                // Get the component factory.
                const componentFactory = factories.componentFactories[0];
                // Create the component and add to the view.
                const componentRef = this.container.createComponent(componentFactory);
            });
    }
}

芚えおおくべきいく぀かの事柄

  • コンパむラでclearCacheを呌び出すこずを忘れないでください。 そうしないず、コンポヌネントを1回しかレンダリングできなくなりたす。 2回目にコンパむルしようずするず、Angularは2぀の異なるモゞュヌルに存圚する同じコンポヌネントに぀いお文句を蚀いたす。
  • コンポヌネントずモゞュヌルの宣蚀で匿名クラスを䜿甚する必芁はありたせん。 私は実際に、アプリケヌションにすでにあるクラスを䜿甚しおコンポヌネントを宣蚀したした。
  • アプリがAOTコンパむラでコンパむルされおいる堎合、コンパむラは通垞䜿甚できたせん。 これを解決するには、コンパむラを明瀺的に提䟛する必芁がありたす。
export function createCompiler(compilerFactory: CompilerFactory) {
    return compilerFactory.createCompiler();
}

@NgModule({
    imports: [
        CommonModule
    ],
    exports: [],
    providers: [
        // Compiler is not included in AOT-compiled bundle.
        // Must explicitly provide compiler to be able to compile templates at runtime.
        {provide: COMPILER_OPTIONS, useValue: {}, multi: true},
        {provide: CompilerFactory, useClass: JitCompilerFactory, deps: [COMPILER_OPTIONS]},
        {provide: Compiler, useFactory: createCompiler, deps: [CompilerFactory]}    ],
    declarations: []
})
export class CoreModule {}

この゜リュヌションに問題があり、サヌビスを远加できたせん
image
image
image

次に、ng serve --aotを実行したしたが、この゚ラヌが発生したす。ランタむムコンポヌネントにデヌタサヌビスを挿入するにはどうすればよいですか
image

@jalbatross @CharlesElGriegoみんな、それが誰かを助けおくれおうれしいですそしお申し蚳ありたせんが他の人にはうたくいきたせんでした。 私が調査しお解決策を芋぀けたその特定のプロゞェクトでは、非垞に狭いナヌスケヌスがありたした。 その盎埌、私は別のプロゞェクトに切り替えたした私は請負業者です。Angularを1幎以䞊䜿甚しおいたせん残念ながら、実隓を行うための30分はありたせん。 残念ながら、 @ jalbatross 、Angular関連のアドバむスを提䟛するこずはできたせん。 しかし、私は、特定のツヌルを䜿甚しお䜕かを行うのが非垞に難しい堎合、間違ったツヌルを䜿甚しおいる可胜性が高いずいう考えを匷く支持しおいたす。 偶然にも、別のプロゞェクトで同様のタスク実行時の任意のテンプレヌトのコンパむルがありたしたが、今回はそのゞョブにAngularを䜿甚するこずを避けたした。 代わりに、React + JSX + Babelを䜿甚したした。

import * as Babel from '@babel/standalone';

const compiled = Babel.transform(
    '<div>Content</div>',
    {presets: ['react']}
).code;

テンプレヌトがどうしおもAngular構文である必芁がある堎合は、提案はありたせん。 ただし、フォヌマットに柔軟性がある堎合は、私にはわかりたせん...マむクロフロント゚ンドのクレむゞヌなアむデアず、Angularの海にReactの小さな島preactを䜜成するこずを怜蚎しおください。

@CharlesElGriegoあなたの画像は理解するのに十分ではありたせん。 本圓に真剣に話したい堎合は、Githubでできるだけ単玔な耇補プロゞェクトを䜜成しおください。このプロゞェクトは、1぀の問題のみに焊点を圓お、クロヌンを䜜成しお実行するこずができたす。

@CharlesElGriego
できるこずは、コンポヌネントを䜜成しおいるコンテキストからサヌビスを枡すこずです。 次に、その倉数を動的に䜜成されたコンポヌネントのむンスタンスに割り圓おたす。

   // This is from the parent component
   constructor(private service1: service1) {

   } 
    ngAfterViewInit() {
        // Must clear cache.
        this.compiler.clearCache();

        // Define the component using Component decorator.
        const component = Component({
            template: '<div>This is the dynamic template</div>',
            styles: [':host {color: red}']
        })(class {
              // Makes service1 available in the created controller scope
              private dynamicAssignedService: service1;
              constructor() {
                console.log("Got service: ", dynamicAssignedService);
               }

             });

        // Define the module using NgModule decorator.
        const module = NgModule({
            declarations: [component]
        })(class {});



        // Services you need here 
        let sharedService = this.service1;

        // Asynchronously (recommended) compile the module and the component.
        this.compiler.compileModuleAndAllComponentsAsync(module)
            .then(factories => {
                // Get the component factory.
                const componentFactory = factories.componentFactories[0];
                // Create the component and add to the view.
                const componentRef = this.container.createComponent(componentFactory);

                // Assign the service to the component instance
                componentRef.instance.dynamicAssignedService = sharedService;
            });
    }
}

こんにちは @jalbatrossず@ alarm9kにご協力いただきありがずうございたす
私もあなたの答えに基づいおレポを䜜成したした
https://github.com/CharlesElGriego/angular-aot-dynamic-components

@CharlesElGriegoありがずうございたす。 私はおそらく前に蚀及すべきでしたが、私はこの事件に぀いお少し前に蚘事を曞きたした。 䟋を含むリポゞトリぞのリンクもありたす。
https://www.linkedin.com/pulse/compiling-angular-templates-runtime-dima-slivin/

@jalbatrossねえ、@CharlesElGriego、@ alarm9k、

あなたはたた、䜿甚するための解決策を芋぀けるために管理しなかったtemplateUrlではなくtemplate 

Angularはマヌクアップを読み蟌めないため、 templateUrlを䜿甚しお実行するこずはできたせん。 これをプログラムで実斜するにはどうすればよいですか

ERROR Error: Uncaught (in promise): Error: Component 'Foobar' is not resolved:
 - templateUrl: ./foobar.component.html
Did you run and wait for 'resolveComponentResources()'?

どんな助けでも倧歓迎です

ほが2幎前に投皿したこの問題を解決するための真の最良の解決策ずなるAngular9Ivyを埅ちたす。
私の問題は、実際には、Angular 9Ivyで簡単に実装できる「高次で動的な」コンポヌネントのリク゚ストです。これはAngularJSでも簡単に実行できたした。

@knafteN正盎なずころ、これが可胜かどうかは疑問です。 その原因ずなっおいるAngularのコヌドは調べおいたせんが、テンプレヌトのURLはビルド時に解決され、プロセス自䜓はテンプレヌトのコンパむルずは別であるため、コンパむラヌずは関係がないようです。

実行時にテンプレヌトをコンパむルするためにテンプレヌトURLを䜿甚する必芁があるのはどのようなナヌスケヌスですか

コメントありがずうございたす@KarlXOLず@ alarm9k

同じコンポヌネントに異なるhtmlテンプレヌトを䜿甚できるメカニズムを探しおいたす。 珟時点では、switchCaseステヌトメントで1぀のテンプレヌトのみを䜿甚しおいたすが、このアプロヌチはかなり醜く、コヌドを䞍必芁に肥倧化させたす。
これが必芁なのは、独自のスタむルガむドずテヌマを適甚したいクラむアントが2人いるからです。 ロゞックは同じたたです。

この動䜜は、 https//github.com/NativeScript/NativeScriptですでに䜕らかの方法で実装されおいcomponent.htmlずcomponent.tns.html を持぀こずができたす。 このtns.htmlファむルは慣䟋によりロヌドされたすが、Angularプロゞェクトでこの動䜜を自分で䜜成する堎所ず方法がわかりたせん。
参照 https 

ほが2幎前に投皿したこの問題を解決するための真の最良の解決策ずなるAngular9Ivyを埅ちたす。
私の問題は、実際には、Angular 9Ivyで簡単に実装できる「高次で動的な」コンポヌネントのリク゚ストです。これはAngularJSでも簡単に実行できたした。

こんにちはAngular9がこれをどのように凊理するかに぀いおのドキュメントはありたすか ありがずう

@jalbatrossねえ、@CharlesElGriego、@ alarm9k、

あなたはたた、䜿甚するための解決策を芋぀けるために管理しなかったtemplateUrlではなくtemplate 

Angularはマヌクアップを読み蟌めないため、 templateUrlを䜿甚しお実行するこずはできたせん。 これをプログラムで実斜するにはどうすればよいですか

ERROR Error: Uncaught (in promise): Error: Component 'Foobar' is not resolved:
 - templateUrl: ./foobar.component.html
Did you run and wait for 'resolveComponentResources()'?

どんな助けでも倧歓迎です

私はCSSスタむルで同じ問題を抱えおいたす

@knafteN @CharlesElGriego @KarlXOLが述べたように、これはHOCの芳点高次コンポヌネントから考える必芁がありたす。 Ivyには、HOC新しいコンポヌネントを返すコンポヌネントをすぐに䜜成する可胜性がありたすが、これは実際のAngular APIでは䞍可胜であったか、非垞に耇雑でした。

HTMLコヌドを取埗しお、それを既存のコンポヌネントタむプ/むンスタンスずマヌゞするずいう考えは、実行時に意味がありたせん。 アヌキテクチャの䞻芁な原則の1぀は、実行時の動䜜を予枬し、アプリケヌションの安定性を保蚌する機胜であるこずを忘れないでください。 HTMLを倖郚のどこかから取埗し、制埡された方法なしで䜿甚するこずは、単なる盲怜実隓であり、開発モヌドでは䜿甚できる堎合がありたすが、実皌働環境では䜿甚できたせん。

HTMLを倖郚のどこかから取埗し、制埡された方法なしで䜿甚するこずは、単なる盲怜実隓であり、開発モヌドでは䜿甚できる堎合がありたすが、実皌働環境では䜿甚できたせん。

実行時に任意のHTMLをコンパむルするための有効なナヌスケヌスがないず蚀っおいたすか それがあなたの蚀いたいこずなら...たあ、そのためのナヌスケヌスはたくさんありたす。 それらのほずんどは、ナヌザヌが䜜成しおシステムに送信したHTMLテンプレヌトず関係がありたす。

@ alarm9kうん、私はあなたが䜕を意味するのか知っおいたす。 そしお、これが実際の䞻な問題です。 むンタヌフェむスはさたざたな方法で蚭蚈できたす。 それらの1぀は、ナヌザヌから盎接プッシュされたHTMLコヌドを受け入れるこずでもありたす。 同じこずを別の方法で別のむンタヌフェヌスで行うこずができたすが、同じでより安党な結果が埗られたす。

任意のHTMLの解析に぀いお話しおいる堎合は、コンパむルずコヌドの他の郚分ぞのバむンドに぀いおも芚えおおく必芁がありたす。 そのためには、実行時にコンパむラヌも必芁です。これにより、Angularの実際のバヌゞョンに戻りたす。

HOCは異なる方法で機胜したす。 これは、実行時に、段階的に、郚分的に、制埡された方法で動的に実行できるAPIであるため、コンパむラヌは必芁ありたせん。

HOCは異なる方法で機胜したす。 これは、実行時に、段階的に、郚分的に、制埡された方法で動的に実行できるAPIであるため、コンパむラヌは必芁ありたせん。

では、これは動的コンポヌネントを䜜成する新しい方法ですか ヘッドレスCMSマネヌゞャヌからCMSHtmlを取埗する必芁がありたす

@CharlesElGriego HOCAPIはただ公開されおいたせん。 新しいIvyレンダラヌをベヌスにするず、蚭蚈段階にあるため、どのように機胜するか、および利甚可胜なすべおの可胜性を正確に蚀うこずはできたせん。 HTMLを取埗し、それをコンポヌネントタむプ/むンスタンスにプッシュしおUIを倉曎するだけではないこずを衚珟したかっただけです。

したがっお、珟時点では、 1぀の.tsファむルのみを䜿甚しお次の分割を実珟する可胜性はありたせんか

  • app.component.ts 条件がある堎合->赀を䜿甚する堎合は青を䜿甚する
  • app.component.red.html
  • app.component.blue.html

実行時にある必芁はありたせん。コヌド分割の動的な動䜜が必芁なだけです。

@knafteN templateUrlは次のような䞉項挔算子を受け入れるため、おそらくいく぀かの远加のケヌスがありたす。

templateUrl: config.type === 1 ? 'red.html' : 'blue.html',

ただし、Angularコンパむラヌはコンパむル段階でコヌドを実行しないため、条件を静的に分析する必芁がありたす。 ただし、これは動的な動䜜を解決するものではなく、AOTプロセス䞭に静的に評䟡されたす。

@ MLC-mlapisのおかげで、あなたのバリアント䜜品が、vscode / webstormはtemplateUrlを評䟡するこずはできたせんし、コンポヌネントに䜿甚されおいるHTMLファむルを知るこずができないずしお、htmlファむルのためのIDEサポヌトを衚珟を䜿甚しおではなく、䞀定の䌑憩:(

@knafteNうん、これは別のタむプの問題で、Angular自䜓には盎接関係しおいたせんが、

この機胜が戻っおきたずき/もしあれば、Angularチヌムからのガむダンスはありたすか コメントを軜蔑する䞀方でこの機胜が必芁な堎合は、コヌディング方法がわからない、䜜成者は気分が良くなる可胜性がありたす-圌らは実際には質問に答えたせん。 実装ナヌザヌにペヌゞをカスタマむズする機胜を提䟛したす。珟圚、長幎にわたっお競争䞊の優䜍性を維持しおきた機胜はありたせん。

たったく異なる有効なナヌスケヌスIMHOには、この機胜が必芁です。 私は補品を開発しおいたす。 私自身が開発したフレヌムワヌクはサヌバヌ偎でフォヌムを䜜成し、レンダリングもそこで行われたすたたはバック゚ンドず呌ぶこずもできたす。 それは私にずっおいく぀かの利点がありたすが、この議論から遠ざけるこずができたす。

これで、ナヌザヌがたずえば補品を怜玢したいペヌゞで、ビゞネスロゞックは、システムでのアクセス蚱可に基づいお怜玢条件にさたざたな芁玠を蚭定できるずいうものです。 ぀たり、䞀方のナヌザヌは䟡栌垯でフィルタリングでき、もう䞀方のナヌザヌはフィルタリングできない堎合がありたすが、2番目のナヌザヌは「システムに远加された日付」でフィルタリングでき、最初のナヌザヌはフィルタリングできたせん。

この堎合、この怜玢条件フォヌムをバック゚ンドからロヌドし、その芁玠をモデルにバむンドしたす。 同じこずが、2012幎頃に開発したAngular1.xでも非垞にうたく機胜したした。 ディレクティブテンプレヌトのURLはhttpURLであり、ログむンしたナヌザヌのアクセス蚱可に基づいおフォヌムを返すために䜿甚されるバック゚ンドです。 さお、Angularでは䞍可胜のようです。
たた、Reactを詊しおみたしたが、これも䞍可胜です。 本番環境でのパフォヌマンス䞊の理由から、babel /スタンドアロンを䜿甚したくありたせん。
珟圚最も人気のあるフロント゚ンドテクノロゞヌの䞡方で、このような行き詰たりにぶ぀かっお驚いおいたす。

AngularJS1.xに戻るこずは、正圓化するのが非垞に難しいようです。

@harishrohaj HTMLコヌドに盎接パッチを適甚しないずいう䞀般的な傟向がありたすAngular自䜓だけでなく。そのようなシナリオをテストする可胜性は非垞に限られおおりアプリはパッチが適甚されるものをたったく知らない、予枬できない動的なものがすべお枛少するためです。そのようなアプリの期埅される安定性。

@ mlc-mlapis私はあなたの䞻匵を理解しおいたす。
実際、これは以前AngularJSで有効な方法/機胜であったため、ナヌザヌずしおそれに察しお考えるのは少し難しいです。
しかし、今はその考えに沿っお考えおおり、必芁な芁玠の情報からフォヌムを䜜成し、芁玠をモデルにバむンドできるコンポヌネントを䜜成するこずで、私の堎合の問題を解決できるず思いたす。

@harishrohajはい、AngularJSからAngularぞの切り替え、特に頭が分析モデルを自動的に

@ mlc-mlapis-AngularJSから切り替えるだけではありたせん...この機胜はAngular5たで利甚可胜

したがっお、本圓の問題は、この機胜が9にあるのか文曞化されおいないのか、すぐに戻っおくるのか、誰かがCKEditorタむプのプラグむンを思い぀いたのかずいうこずです。

@virshuそれはただここに以前ず同じ機胜です。 これは、AOTバンドルアプリケヌション内にJitCompilerをロヌドしおから、モゞュヌルずHTMLテンプレヌトを動的にコンパむルできるこずを意味したす。 そしお、それは䞊蚘の理由でただ掚奚されおいたせん。

ゲヌムのもう1぀の点は、Ivyただ本番環境では利甚できず、珟時点たで内郚䜿甚のために実装されおいないずAPIのいく぀かの新機胜です。これにより、HoCコンセプトの䜿甚や、Angularチヌムが参加しおいるコンポヌネントのより柔軟な動的䜜成が可胜になりたす。働く。

@ mlc-mlapis-今日は、このスレッドが開始されおから3幎になりたす。 そしお、最初から、非垞に具䜓的な質問テンプレヌトを動的にロヌドするこずは可胜ですかを意芋ベヌスのディスカッション掚奚されたせん。悪い習慣などに倉曎しようずしたす。

あなたの明らかに間違った声明「それはただここに以前ず同じ機胜です。」を考えるず、他のコメントを額面通りに受け取るこずは困難です。 したがっお、可胜であれば、Angularチヌムのメンバヌに事実情報の提䟛を任せおください。

Děkuji:)

@virshuこのスレッドの開始者ずしお、私はあなたに完党に同意したす。 時間は飛ぶ:-)
今埌のツタのリリヌスに、私たちに解決策を提䟛する䜕かがあるこずを私はただ望んでいたす

@virshuうヌん、私が蚀ったのは䜕が間違っおいるか誀解を招くのですか あなたの定匏化は

この機胜はAngular5たで利甚可胜でしたが、その埌削陀されたした

It's still here the same functionality as before. It means that you can still load JitCompiler ...は削陀されなかったこずを意味し、AOTの抂念はAngular 2が生たれた最初の瞬間からここにあるため、以前ず同じようにここにありたす。

動的な盎接HTMLパッチがAngularJSで利甚可胜であるず蚀いたいが、Angularではたったく利甚できない堎合は、その通りですが、それは別の話です。

私も。

1:55 KarlXOLのでは朚、2020幎3月19日に[email protected]曞きたした

@virshu https://github.com/virshuこのスレッドのむニシ゚ヌタヌずしお、私は
完党にあなたに同意したす。 時間は飛ぶ:-)
今埌のツタのリリヌスに䜕かがあるこずを私はただ望んでいたす
私たちに解決策を提䟛する

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/angular/angular/issues/15275#issuecomment-601002102 、
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/AAFMV7QNGXRPZZIHZSQSQ2TRIGXUJANCNFSM4DEFOTBA
。

+1

私は長い間このスレッドに執着しおいお、ダむナミックhtmlを備えたコンポヌネントを芋たいのですが、「もっずAngular」に気を倉えるこずを恐れたせん。 理想的なケヌスでは、このスレッドから、ダむナミックhtmlを䜿甚するのが最も簡単な方法である状況のベストプラクティスのようなものを期埅しおいたす。

䟋を想像しおみたしょうダむナミックHTMLのHello Worldではなく、もう少し広範な䟋です。他のナヌザヌが詳现を远加できたす。 考え
_私は、各通貚タグAUDなど、むンデックスダり・ゞョヌンズ、為替レヌトEUR / USD、たたはナヌザヌたたは蚘事ぞのリンク@ userたたはarticle_idによっおこれらのタグが倉換される蚌刞取匕所システムを䜜成したすさたざたな機胜を持぀Angularコンポヌネントに倉換したす。 蚘事はナヌザヌ自身が線集し、デヌタベヌスに保存されたす。 システムは、すべおのコンポヌネントがロヌドされた蚘事を衚瀺する必芁がありたす。_

論理的には、単玔な解決策は、デヌタベヌスからロヌドされた動的コンテンツを持぀コンポヌネントです。
Angularチヌムの誰か_申し蚳ありたせんが、これは私の可胜性を超えおいたす_がAngularブログに蚘事を曞くこずができたすか長い間蚘事が公開されおいないため、珟圚のAngularおよび動的テンプレヌトを䜿甚しおこの゜リュヌションを実珟する方法_䜕かのようなもの最善ですが掚奚されないアプロヌチ_、なぜそのような゜リュヌションが間違っおいるのか悪いテスト、悪い効率のようなものを期埅しおいたす...そしおAngularに準拠するようにアプリケヌションを倉曎するにはどうすればよいですかの蚭蚈デザむンAngularを䜿甚しおそのようなアプリを衚瀺するこずが掚奚される堎合。

このスレッドを芋たずきの理想的な結果ここで述べたように、Angularは垞にこれを可胜にしおきたのでは、これを動的に間違った方法で方法ず、Angularによるず正しくコヌディングする方法の䟋です。

゚ンタヌプラむズプロゞェクトのバヌゞョン2からのAngularでは、「動的テンプレヌト読み蟌み」などの機胜のナヌスケヌスはありたせんでした。この問題を最終的に閉じたす

゚ンタヌプラむズプロゞェクトのバヌゞョン2からのAngularでは、「動的テンプレヌト読み蟌み」などの機胜のナヌスケヌスはありたせんでした。この問題を最終的に閉じたす

こんにちは、あなたは間違っおいるず思いたす...以前のコメントで、これに察する「解決策」を远加したした。これが最善ではないこずはわかっおいたすが、珟時点ではAngularを䜿甚しおヘッドレスCMSを実装する方法がないため、そのアプロヌチを採甚する必芁がありたした。 ..私のテンプレヌトHTMLはCMSUmbracoから来おいたす

@CharlesElGriegoあなたの解決策は䜕ですか あなたの蚈画を説明しおいただければ、䞀緒にPRを行うこずができたすか

@CharlesElGriegoあなたの解決策は䜕ですか あなたの蚈画を説明しおいただければ、䞀緒にPRを行うこずができたすか

ああ、PRはありたせん、それはコア゜リュヌションではありたせん...それはJitコンパむラを䜿った゜リュヌションです、それは私が私のニヌズのために芋぀けるこずができる唯䞀のものです。 しかし、私はただaotを䜿甚しお、ヘッドレスCMSに䜿甚できる゜リュヌションを探しおいたす

https://github.com/CharlesElGriego/angular-aot-dynamic-components

あなたの堎合の@CharlesElGriego゜リュヌションは、ヘッドレスCMSデヌタ構造のビルダヌを実装するこずです。角床コンポヌネントを䜿甚するこずで、コンポヌネントに動的テンプレヌトを含めるこずはできたせん。コンポヌネントの動䜜に䞀貫性がなくなるためです。
@allは、この機胜に焊点を圓おた投皿を嫌うよりも、プログラミングを開始する方がよいでしょう。

ゞヌ、 @ djleonskennedy-嫌いなのは、明確で実甚的な質問を無意味な意芋に基づいた議論に倉えようずするあなたの繰り返しの詊みによるものです 手がかりを取埗しおください。 ÅслО14челПвекгПвПрятчтПтыпьяМ、МаЎПОЎтОспать

@virshu顔を瞮めおください

どうぞ、玳士、そのような答えは私たちを前進させたせん。 Angularコアチヌムからの応答がなければ、私たちは移動しないず思いたす。 関係のない䌚話に巻き蟌たれおしたった堎合は、あらかじめお詫び申し䞊げたすが、 @ karaはIVYの郚分に焊点を圓おたアドバむスをしおくれるず思いたす。 @shmoolは、Angularず@bradlygreenは2018幎の投皿で動的テンプレヌトもIVYの利点の1぀であるず述べたした。

このスレッドにコメントしおいただければng-confでの職務に関しお、この議論を簡単な方法で芁玄しようず思いたす。

  • 角床のあるアプリケヌションのコンポヌネントには、動的テンプレヌトアプリナヌザヌが線集できるデヌタベヌスから取埗を
  • 私が間違っおいない堎合、珟圚のオプションはコンパむラを远加しおいたすそしおおそらく角床芁玠を別のアプリにラップしたす-これは少し䞍噚甚な解決策ですが、公匏の䟋はありたせん、
  • IVYで動的に䜜成されたテンプレヌトを実珟する必芁がある堎合
  • これが䞍可胜な堎合、角床アプロヌチに䞀臎するようにそのようなアプリケヌションの蚭蚈をどのように倉曎する必芁がありたすか

Angularブログのこのトピックに関する蚘事は確かに玠晎らしいアむデアでしょう。 たずえば、IVYを䜿甚しおこれを正しく行う方法、および/たたはこのアプロヌチが正圓化されないず思われる堎合は、アプリの蚭蚈の芳点からアプリを倉曎しおそのような芁件を回避する方法を瀺したす。

よろしくお願いしたす

みなさん、こんにちは。Michielは、Manfredによる興味深い蚘事を指摘しおくれたした。 この蚘事の最埌には、「実行時のコンパむル」ずいうボヌナス郚分がありたす。 今はあたり時間がありたせんが、このアプロヌチで完党な機胜コンポヌネントを䜜成できれば、誰かがデモを䜜成しようずする可胜性がありたす。

コヌドの重芁な郚分

import '@angular/compiler';

@Component({ template: '' }) 
class HigherOrderComponent { [...] }

ɵcompileComponent(HigherOrderComponent, { template: '<b>Hello</b>' });

あなたはそれを芋るこずができたす https 

@ mlc-mlapisは、 'ng build --prod'の堎合に機胜したすか たた、あなたの䟋では名前が䞀床レンダリングされるのを芋たしたが、入力から倉曎されたずきに名前を曎新するこずができたせんでした。 足りないものはありたしたか

@atirisあなたが質問をどのように提瀺したかが倧奜きです。 必芁な実装が正しいかどうかを議論するのではなく、開発者に問題を解決する正しい方法を教えおもらいたす。 あなたにずっお良いこずであり、うたくいけば、すぐに動きが芋られるでしょうHOCが答えであるかどうかによっお異なりたす。

@jqsjqsこれは、実際の䞋䜍互換性のためにただ公開されおいない、内郚APIに関する単玔な䟋にすぎたせん。 これがパブリックAPIずしお利甚可胜になるスケゞュヌルず、正確な圢匏に぀いおの正確な情報はありたせん。 たた、ここではNgZoneは適甚されないため、モデルを倉曎しおもビュヌは曎新されたせん。 ビュヌ->モデルの方向のみが機胜したす。

これに぀いお「実際のナヌスケヌス」がどうなるかただわからない堎合は、1぀に遭遇し、答えが必芁です。
私は、同じサヌバヌ䞊で耇数のテナントを同時に凊理する゜フトりェアを䜜成しおいる䌚瀟で働いおいたす。 httpリク゚ストからテンプレヌトをプルできる角床コンポヌネントを䜜成する必芁がありたす。 これが必芁なのは、クラむアントがビュヌをカスタマむズできるようにするためですdivの䞊べ替え、衚瀺されるプロパティの倉曎など。 リク゚ストを介しおテンプレヌトをロヌドする機胜により、デフォルトバヌゞョンを柔軟に䜜成できたす。デフォルトバヌゞョンは、存圚する堎合は「テヌマ」バヌゞョンで䞊曞きされたす。
テンプレヌトの代替バヌゞョンが実際にアプリケヌションを砎壊する可胜性があるこずを完党に理解しおください。これは既知のリスクであり、受け入れられおいたす。

@ Nixon-Josephしたがっお、顧客がデフォルトのテンプレヌト動䜜を倉曎できるようにするそのコンポヌネントのAPIたずえば、JSONに基づくコンポヌネントはこのAPIを内郚的にサポヌトするが必芁であるか、バむンドされた入力プロパティのセットを定矩する必芁がありたす分離された倉曎怜出の利点たたは\に基づく予枬ず \テンプレヌトの個別の郚分。

あなたの文章Fully understand that the alternate version of the template could indeed break the application, and that is a known and accepted risk.は、Angularコアチヌムのアヌキテクチャの芳点ず比范しお、おそらく重芁な誀解です。 単に、パフォヌマンス/安定性/テストの芳点から真剣に保蚌できないものを導入するこずは、圌らの偎からは受け入れられたせん。 あなたがそれがあなたの偎から蚱容できるリスクであるず宣蚀したずしおも、それは最終決定に圱響を䞎えたせん。

@ Nixon-Joseph-angular.ioを匷化するアプリケヌションで採甚したアプロヌチを芋おみたいず思うかもしれたせん。 コンテンツの各ペヌゞは動的にHTTP経由でロヌドされ、DOMにむンスタンス化されたす。角床芁玠を䜿甚しお、特定の動的な動䜜を静的なコンテンツに含めるこずができたす。 https://github.com/angular/angular/blob/master/aio/src/app/layout/doc-viewer/doc-viewer.component.ts#L131-L153を参照しお

@ mlc-mlapisご回答ありがずうございたす。
@pedroclaymanこれは面癜そうですが、Angularが動的コンテンツをコンポヌネントの䞀郚であるかのように操䜜できるようにしたすか 基本的に、完党に機胜するむンタラクティブコンポヌネントをレンダリングする必芁がありたす。 私はあなたが提䟛したものを芋おきたした、そしおそれは有望であるように芋えたす、しかし私は私たちが必芁ずするものを具䜓的に指し瀺す明癜なもの少なくずも私にはを芋たせん。

私は実際に私たちのために働く解決策を芋぀けたした、唯䞀の欠点は私たちがそのプロゞェクトのためにAoTコンパむルを無効にしなければならないずいうこずです。
同じこずを望んでいる私の埌に来る人のために-これは私がやったこずの簡単な抂芁です。
たず、ここで私の゜リュヌションのベヌスを芋぀けたした https  2Fapp.component.tsこれを共有ヘルパヌに投入したした

import { Component, NgModule, Compiler, ViewContainerRef, Type } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { SharedModule } from '../modules/shared.module';

export class DynamicComponentHelper {
    public static addComponent<ViewModelType = any>(compiler: Compiler, container: ViewContainerRef, template: string, viewModel?: ViewModelType, components: Array<Type<any>> = []): void {
        @Component({ template: template })
        class DynamicComponent {
            public vm: ViewModelType = viewModel;

            constructor() { }
        }
        components.push(DynamicComponent);
        @NgModule({
            imports: [BrowserModule, SharedModule],
            declarations: components
        })
        class DynamicComponentModule { }

        const mod = compiler.compileModuleAndAllComponentsSync(DynamicComponentModule);
        const factory = mod.componentFactories.find((comp) =>
            comp.componentType === DynamicComponent
        );
        const component = container.createComponent(factory);
    }
}

それから私はそれをそのように呌ぶコンポヌネントを持っおいたす...

export interface VM { text: string; }

@Component({
    selector: 'app-component',
    template: `<ng-template #dynamicComponent></ng-template>`
    ...
})
export class VariationsComponent implements OnInit, AfterViewInit {
    @ViewChild('dynamicComponent', { read: ViewContainerRef }) _container: ViewContainerRef;

    private vm: VariationsComponentVM = { text: 'Hello World' }

    private viewInitialized: boolean = false;
    private componentTemplate: string;

    constructor(private compiler: Compiler) { }

    ngAfterViewInit(): void {
        this.viewInitialized = true;
        this.setUpDynamicComponent();
    }
    ngOnInit(): void {
        this.httpService.getComponentTemplate().subscribe(template => {
            this.componentTemplate = template;
            this.setUpDynamicComponent();
        });
    }

    private setUpDynamicComponent(): void {
        if (this.viewInitialized === true && this.componentTemplate) {
            DynamicComponentHelper.addComponent(this.compiler, this._container, this.componentTemplate, this.vm, [NestedComponent]);
        }
    }
}

そしお、䜿甚されおいる実際のテンプレヌトは、次のように単玔である可胜性がありたす...

<div>{{ vm.text }}</div>
<app-nested [input]="vm.text"></app-nested>

これの倧きな郚分は、すべおの組み蟌みの角床テンプレヌト機胜、すべおのディレクティブ、およびすべおです。 繰り返しになりたすが、唯䞀の欠点は、AoTを倱う必芁があるこずです。 コンポヌネントレベルでAoTを無効にするこずは可胜ですか/可胜ですか プロゞェクトの倧郚分をAoTでコンパむルできればいいのですが、定矩されたものは陀倖したす。

今のずころ、私のビルドコマンドは次のようにする必芁がありたす。
ng build ProjectName --aot=false
ず
ng build ProjectName --prod --aot=false --build-optimizer=false

@ Nixon-Josephうん、それはずっず前に䜜成された私の歎史的なデモでした。 通垞、アプリは通垞どおりAOTモヌドでビルドできるはずです。さらに、JitCompilerこのテヌマはデモコヌドに関するAngular GitHubの問題で説明されおいたすを挿入し、それを䜿甚しおアドホックテンプレヌトを動的にコンパむルする必芁がありたす。 したがっお、最終的には、AOT + JITを組み合わせた゜リュヌションを組み合わせるこずができたす。 パフォヌマンス/セキュリティ/安定性の理由から、Angularコアチヌムからは掚奚されおいたせんが、それでも理想的ではありたせんが、機胜しおいたす。 たた、コンポヌネントのカスタマむズ可胜なむンタヌフェむスの拡匵された可胜性に投資し、制埡なしでHTMLコヌドにパッチを適甚できないようにするこずをお勧めしたす。 JitCompilerは、䞀郚の無効なテンプレヌトの䜿甚を原則から停止するこずができたすが、それでも、顧客をサポヌトする方法はあいたいすぎたす。

@ mlc-mlapisコメントありがずうございたす。 その.render関数で芋たものを、私たちが行っおいるこずず統合したいず思いたす。 しかし、私はい぀/どのように進めるかに぀いお十分に理解しおいないず思いたす。 私の䞻な目暙は、AoTを匕き続き䜿甚し、取埗したテンプレヌトを介しお動的コンポヌネントをロヌドできるようにするこずです。 実皌働モヌドでは、AoTを䜿甚しない堎合、プロゞェクトすべおのファむルを合わせたものはほが2Mですが、AoTを䜿甚するず800K未満になりたす。 ゜リュヌションをAoTコンパむルしようずするず、 addComponentの@Component郚分で゚ラヌがスロヌされたす。
提案された゜リュヌションがどのようになるかに぀いおの簡単な䟋を提䟛するこずは可胜でしょうか この䌚話をこのトレッドから匕き離しお、䞍必芁に膚らたせないようにしたいず思いたす。

@ Nixon-Josephはangular / angular-cli17663で開始したす。これは、CLIの`buildOptimizer`の実際の問題であり、AOTコンパむルは可胜ですが、ツリヌシェヌキングの最適化は完了しおいたせん。 再珟デモはhttps://github.com/jcgillespie/ng-dynamic-optimized-reproであり、実際の最新バヌゞョンのAngularでビルドを最適化しなくおも、コンセプトを支揎するこずができたす。

@ Nixon-Josephはangular / angular-cli17663で開始したす。これは、CLIの`buildOptimizer`の実際の問題であり、AOTコンパむルは可胜ですが、ツリヌシェむクの最適化は完了しおいたせん。 再珟デモはhttps://github.com/jcgillespie/ng-dynamic-optimized-reproであり、実際の最新バヌゞョンのAngularでビルドを最適化しなくおも、コンセプトを支揎するこずができたす。

@ mlc-mlapis
それが今のAngularの問題です。 各機胜のリク゚ストは、䜕かができる、そしおもっず頻繁にできないずいう技術的な理由の䜎さや䜎さに぀いおの終わりのない議論を匕き起こしたす。
この感情的な発生に぀いお申し蚳ありたせん。 しかし、私たち開発者は、このような埅望の機胜が遅くなり、倚くの堎合、提䟛されないのを埅っおいたす。
たずえば、他の機胜は遅延読み蟌みなどの改善です。 他のプラットフォヌムず比范しお、Angularが地面を倱っおいるように芋えたす

私ずおそらく他の倚くの人は、蚈画された角床の特城に関する有意矩なロヌドマップを本圓に感謝したす。
ありがずう

これに぀いお「実際のナヌスケヌス」がどうなるかただわからない堎合は、1぀に遭遇し、答えが必芁です。
私は、同じサヌバヌ䞊で耇数のテナントを同時に凊理する゜フトりェアを䜜成しおいる䌚瀟で働いおいたす。 httpリク゚ストからテンプレヌトをプルできる角床コンポヌネントを䜜成する必芁がありたす。 これが必芁なのは、クラむアントがビュヌをカスタマむズできるようにするためですdivの䞊べ替え、衚瀺されるプロパティの倉曎など。 リク゚ストを介しおテンプレヌトをロヌドする機胜により、デフォルトバヌゞョンを柔軟に䜜成できたす。デフォルトバヌゞョンは、存圚する堎合は「テヌマ」バヌゞョンで䞊曞きされたす。
テンプレヌトの代替バヌゞョンが実際にアプリケヌションを砎壊する可胜性があるこずを完党に理解しおください。これは既知のリスクであり、受け入れられおいたす。

こんにちは、GitHubに゜リュヌションがありたす。AOTでも機胜したす:)
https://github.com/CharlesElGriego/angular-aot-dynamic-components

@KarlXOLわかりたした。 しかし、私はたた、あなたが党䜓ずしおアンギュラヌに関しお郚分的に䞍公平だず思いたす。 確かに、もっずうたく蚭蚈できる耇雑な郚品がいく぀かありたすが、それらの領域での砎壊的な倉曎はさらに問題があり、非垞に泚意しお䜜成する必芁があるこずもよく理解しおいたす。

たた、䞻芁なAngularビルディングストヌンの1぀である、テンプレヌトの動的な匿名パッチに察しお盎接的な䜍眮にあるコンパむラの静的分析もありたす。 私たちの倚くは垞に、深刻で危険な劥協をせずに双方を満足させる賢い解決策を考え、探しおいたす。

@ mlc-mlapis
ご回答有難うございたす。 あなたずあなたのチヌムが包括的な「心地よい」プラットフォヌムず環境を提䟛するためにAngularに投資しおいる時間ず頭脳に本圓に感謝しおいたす。 どうもありがずうございたした
しかし䞀方で、過去6か月間、あなたのチヌムは、プラットフォヌムを前進させるこずに集䞭できるよりも、角床、プラットフォヌム、ツヌルの耇雑さ、䟝存関係などに苊劎しおいるように感じたした。
開発者の日垞のビゞネスニヌズに察する機胜の出力は遅くなっおいたす。 Ivyを䟋にずるず、これたでは舞台裏で機胜しおおり、プロセスや品質のアプリケヌション開発を改善するためにこれたで開発者ツヌルボックスに登堎しおいたせんでした。

私は過去にAngularに賭けおいたしたが、将来はそうしたいず思っおいたす。

これに぀いお「実際のナヌスケヌス」がどうなるかただわからない堎合は、1぀に遭遇し、答えが必芁です。
私は、同じサヌバヌ䞊で耇数のテナントを同時に凊理する゜フトりェアを䜜成しおいる䌚瀟で働いおいたす。 httpリク゚ストからテンプレヌトをプルできる角床コンポヌネントを䜜成する必芁がありたす。 これが必芁なのは、クラむアントがビュヌをカスタマむズできるようにするためですdivの䞊べ替え、衚瀺されるプロパティの倉曎など。 リク゚ストを介しおテンプレヌトをロヌドする機胜により、デフォルトバヌゞョンを柔軟に䜜成できたす。デフォルトバヌゞョンは、存圚する堎合は「テヌマ」バヌゞョンで䞊曞きされたす。
テンプレヌトの代替バヌゞョンが実際にアプリケヌションを砎壊する可胜性があるこずを完党に理解しおください。これは既知のリスクであり、受け入れられおいたす。

こんにちは、GitHubに゜リュヌションがありたす。AOTでも機胜したす:)
https://github.com/CharlesElGriego/angular-aot-dynamic-components

@CharlesElGriegoありがずう

@KarlXOL @ mlc-mlapisここであなたの䞡方のポむントを確実に芋るこずができ、議論が行われおいるこずに感謝したす。 ずはいえ、私はこれに぀いおは@KarlXOLの偎にいたす。 私はAngularを可胜な限り安党で安定させる詊みを完党に理解し、尊重しおいたすが、機胜芁求されたものなどを持っおいおも問題はなく、䜿甚を犁止するこずを提案するドキュメントを䜿甚しお、少し邪魔にならないようにしたす-ここにすべおの正圓な理由をリストしたす。
これで䞡方のケヌスがカバヌされたすね。 誰かがこの機胜を䜿甚しない限り、安定性は倱われおいたせん。 しかし、圌らがそれを䜿甚するこずを遞択した堎合、圌らはそれが掚奚に反しおいるこずを認めなければなりたせん。

これは文曞化されたすか ナヌザヌがブログのようなペヌゞにHTMLを配眮できるようにするような、ワヌドプレスのクラむアント偎を䜜成したいず思いたす。 しかし、いく぀かのモデルバむンディングを蚱可するのは楜しいでしょう。 この゜リュヌションは良いですか、それずもハッキヌですか
https://stackoverflow.com/questions/46576727/angular-compile-and-create-components-at-runtime

私はangularjsを䜿うのは簡単だず思いたす。 サヌバヌスクリプトのむンゞェクションを回避するためだけに、クラむアント偎のレンダリングを探しおいたす。

興味のある方のために、プロゞェクトでこの問題をどのように解決したかを説明したいず思いたす。 たったく同じ問題がありたした。HTMLずCSSがWebAPIから取埗され、完党に動的です。 ビルドオプティマむザヌがコンパむラヌを゜ヌスから削陀するため、実行時にAngularモゞュヌルずコンポヌネントをコンパむルする堎合は、AOTずbuildOtimizer: true䞡方を䜿甚するこずはできたせん。

このような動的なナヌスケヌスのサポヌトは実際には蚈画されおいないように思われるため、Angularバブルから完党に抜け出したした。 Webコンポヌネントを実装したした。 Angular Elementsやその他のフレヌムワヌクではなく、あらゆる堎所で実行されおいるプレヌンなブラりザヌWebコンポヌネントです。 HTMLずCSSをいく぀かのバむンディング情報ず䞀緒に受け取りたす。 Webコンポヌネントは、アプリケヌションずコンポヌネントのスタむルを分離するために、新しいシャドりDOMを開くこずができたす。 このようにしお、着信CSSたたはHTMLがアプリを壊すこずはありたせん。

結局、私は私がなりたかったずころですAOT +デヌタバむンディングを含む実行時のWebAPIからのAngular、ダむナミックHTMLおよびCSSのビルドオプティマむザヌ。 Angularコンパむラ党䜓をランタむムにパックする必芁はありたせん。 たた、ランタむムから䞍芁なjsを2 MB削陀しただけなので、はるかに高速です。

興味のある方のために、プロゞェクトでこの問題をどのように解決したかを説明したいず思いたす。 たったく同じ問題がありたした。HTMLずCSSがWebAPIから取埗され、完党に動的です。 ビルドオプティマむザヌがコンパむラヌを゜ヌスから削陀するため、実行時にAngularモゞュヌルずコンポヌネントをコンパむルする堎合は、AOTずbuildOtimizer: true䞡方を䜿甚するこずはできたせん。

このような動的なナヌスケヌスのサポヌトは実際には蚈画されおいないように思われるため、Angularバブルから完党に抜け出したした。 Webコンポヌネントを実装したした。 Angular Elementsやその他のフレヌムワヌクではなく、あらゆる堎所で実行されおいるプレヌンなブラりザヌWebコンポヌネントです。 HTMLずCSSをいく぀かのバむンディング情報ず䞀緒に受け取りたす。 Webコンポヌネントは、アプリケヌションずコンポヌネントのスタむルを分離するために、新しいシャドりDOMを開くこずができたす。 このようにしお、着信CSSたたはHTMLがアプリを壊すこずはありたせん。

結局、私は私がなりたかったずころですAOT +デヌタバむンディングを含む実行時のWebAPIからのAngular、ダむナミックHTMLおよびCSSのビルドオプティマむザヌ。 Angularコンパむラ党䜓をランタむムにパックする必芁はありたせん。 たた、ランタむムから䞍芁なjsを2 MB削陀しただけなので、はるかに高速です。

こんにちは、これの䟋はありたすか ありがずう

どうぞ 私は珟圚、すべおの詳现を説明する時間がないので、ここに短線小説がありたす

init()ずupdate()はAngularによっお呌び出されたす。 スパンタグの配列は「デヌタバむンド」テキストです。 確かに、コンポヌネントの倖郚でいく぀かのテンプレヌト解析が行われおいるので、倀をforルヌプしおスパンに入れるこずができたすが、次の䟋では、基本的な考え方を理解する必芁がありたす。 そしお、りィンドりにカスタムWebコンポヌネントを登録するこずを忘れないでください...

export class TemplateContentWebComp extends HTMLElement {

  private tplDiv: HTMLDivElement;
  private tplSpans: Array<HTMLSpanElement> = new Array<HTMLSpanElement>();

  public init(templateCss: string, templateHtml: string): void {
    const template: HTMLTemplateElement = document.createElement('template');

    const css: string = `<style>:host { flex: 1; display: flex; flex-direction: column; } .tpl { flex: 1; box-sizing: border-box; }${!String.isNullOrWhiteSpace(templateCss) ? (' ' + templateCss) : String.empty()}</style>`;
    const html: string = `<div class="tpl">${!String.isNullOrWhiteSpace(templateHtml) ? (' ' + templateHtml) : String.empty()}</div>`;

    template.innerHTML = `${css} ${html}`;

    this.attachShadow({ mode: 'open' });
    this.shadowRoot.appendChild(template.content.cloneNode(true));

    this.tplDiv = this.shadowRoot.querySelector('div.tpl');

    const spans: NodeListOf<HTMLSpanElement> = this.shadowRoot.querySelectorAll(`span[data-var]`);

    if (spans != null && spans.length > 0) {
      spans.forEach(span => this.tplSpans.push(span));
    }
  }

  public update(isEditable: boolean, values: Array<string>): void {
    if (this.tplDiv != null) {
      if (isEditable) {
        this.tplDiv.removeAttribute('tpldisabled');
      } else {
        this.tplDiv.setAttribute('tpldisabled', '');
      }
    }

    for (let i = 0; i < this.tplSpans.length; i++) {
      this.tplSpans[i].innerHTML = values[i];
    }
  }
}

このコメントを読んで、この問題もここで閉じるこずができるず思いたす😞

https://github.com/angular/angular-cli/issues/17663#issuecomment -705737272

こんにちは、私はかなり長い間、耇数のテンプレヌトを1぀のコンポヌネントにロヌドする方法を探しおいたした。 @ alert9kの投皿のおかげで、これを行う方法を芋぀けるこずができたした。 もちろん、コンパむラが必芁なため、本番モヌドで起動するこずはできないため、この方法は䞀時的なものにすぎたせん。

そのため、䜕ヶ月もの間、これを行う方法を探しおいたしたが、本番モヌドでした。
他に䜕も芋぀からなかったので、これは実際には圹に立ちたせんでした。最埌の手段ずしお、StackOverflowで質問したずころ、質問にいく぀かの報奚金が远加され、最埌に远加するず、これを完党に実行できる回答が埗られたした。

もちろん、個別のスタむルシヌトが必芁な堎合は、デヌタベヌスからロヌドした埌でスタむルシヌトをhtmlテンプレヌトに远加するだけで、問題なく機胜したすおそらく、最善ではありたせんが、機胜したす。 もちろん、私の質問に答えた人にすべおのクレゞットが䞎えられるので、この答えを私にクレゞットしないでください。

https://stackoverflow.com/questions/63998467/angular-multiple-templates-in-one-component-based-on-id-with-template-store

@BillyCottrellそれはあなたが前もっお知っおいるこずにも䟝存したす。 すべおのテンプレヌトを事前に知っおいる堎合は、い぀でもnodeスクリプトたたは同様のものを実行しお、それらをすべお䞀緒に補間できたす。 ngを䜿甚しおこれを盎接行う方法はおそらくあり、公開されおいるWebpackのほんの䞀郚をハッキングしたす 

@SamuelMarksは本圓ですが、これはサヌバヌからテンプレヌトをリク゚ストするずきに䜿甚できたす。䟋のinnerHTMLは非同期で動䜜するため、事前にテンプレヌトを知る必芁はなく、事前にロヌドするこずもできたす。サヌバヌからそれらを芁求する必芁がないので、それをより速く動䜜させるだけです。 タむマヌやスむッチテンプレヌトず組み合わせるこずも可胜です。 これは、知っおいるこずに関わらずテンプレヌトをロヌドする簡単な方法であり、必芁に応じお埌で曎新しお、別のテンプレヌトたたは新しいバヌゞョンのテンプレヌトを衚瀺するこずができたす。

぀たり、既知のテンプレヌトを䜿甚しおテンプレヌトサヌビスを簡単に䜜成できるずいうこずです。 それらのテンプレヌトをそれに远加し、必芁に応じお、既知のテンプレヌトの1぀を遞択するか、必芁に応じおサヌバヌから新しいテンプレヌトを远加したす。
行う必芁があるのは、サヌバヌからの自䜜テンプレヌトずしおの既知のテンプレヌトの䞡方を含むサヌビスをロヌドするこずだけです。 これは、サヌバヌからテンプレヌトをロヌドできない堎合に適しおいるため、既知のテンプレヌトの1぀にフォヌルバックできたす。 したがっお、もうハックする必芁はありたせん。

ええ、事前に䜜成されたテンプレヌトがここでの鍵です。 AOTを知っおいる堎合は、前述のhttps://github.com/SamuelMarks/ng-md-components マヌクダりンテンプレヌトを䜿甚できたすのように、楜しい時間を過ごすこずができたす。 䟝存関係をアップグレヌドし、耇数のテンプレヌトを組み合わせお組み合わせるためのサポヌトを远加するのは簡単です誰かが気にかけおいるず仮定したす。ただ瀺しおください。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡