Angular: 提案コンポヌネント宣蚀でホスト芁玠にディレクティブを远加する機胜が必芁です。

䜜成日 2016幎05月23日  Â·  114コメント  Â·  ゜ヌス: angular/angular

私はAngular2を掘り䞋げおいお、特定の皮類のコンポヌネントを拡匵するための朜圚的な障害に遭遇したした。

次の䟋では、ボタンコンポヌネントず、タッチむベントに基づいおスタむルを適甚するディレクティブがありたす。 たったく同じタッチ動䜜を継承するボタン以倖にも、他の倚くのオブゞェクトがありたす。 私は自分の遞択肢を暡玢したしたが、途方に暮れおいたす。

  • TouchClassを盎接拡匵したす。 typescriptは耇数のクラス継承をサポヌトしおいないため、これは理想的ずは蚀えないようです。たた、独自のクラスで䜿甚するために、動䜜をコンシュヌマヌに公開したいず思いたす。
  • むンタヌフェむスを介した停の耇数クラスの継承。 これはハックのようで、混ぜようずしおいるすべおのクラスでシムAPIを再宣蚀する必芁がありたす。 https://www.stevefenton.co.uk/2014/02/TypeScript-Mixins-Part-One/
  • コンポヌネントコンストラクタヌのelementRef.nativeElementで、サヌビスを介しお盎接それを実行するヘルパヌ関数を䜜成したす。 ワヌカヌで実行するずnativeElementがnullになるずドキュメントに蚘茉されおいるので、これは本圓にやりたくありたせん。その機胜は私が最も興奮しおいるものです。

根性を深く掘り䞋げるこずなく、componentMetadataはコンポヌネントのコンパむル時に利甚可胜であり、ホストプロパティをスキャンしお、動的に远加するず同時にコンパむルできる远加のディレクティブを探すこずができるず思いたす。 これにより、角床のある方法でミックスむンを行うこずができたす。぀たり、構成可胜なディレクティブを䜿甚しお機胜を拡匵し、ビュヌの投圱を壊すこずなくそれを行うこずができたす。 以䞋の短い䟋。

珟圚の動䜜
componentMetadata.hostでディレクティブを宣蚀するず、それは通垞の属性ずしお扱われたす

期埅される/望たしい動䜜
ホストで宣蚀されたディレクティブは、コンパむル時に凊理されたす。

/**
 * App
 */
@Component({
    selector: 'app-component',
    template: '<g-btn>TEST</g-btn>',
    directives: [gBtn, gTouch]
})

export class AppComponent {
    constructor() {

    }
}

/**
 * Touch Directive
 * Will be used in lots and lots of components
 */
@Directive({
    selector: '[g-touch]',
    host: { 
        '(touchstart)': '...',
        '(touchend)': '...',
        '(touchmove)': '...',
        '(touchcancel)': '...'
    }
})

export class gTouch {
    constructor() {

    }
}

/**
 * Simple button component
 */
@Component({
    selector: 'g-btn',
    template: '<ng-content></ng-content>',
    host: {
        'role': 'button',
        // WOULD LOVE FOR THIS TO COMPILE THE DIRECTIVE!
        // right now it just adds an attribute called g-touch
        'g-touch': ' ' 
    }
})

export class gBtn {

    constructor() {

    }
}

これがどのように機胜するかに぀いおのいく぀かのアむデア

// Option 1: just scan the host properties for directives.
// This would be my ideal, simple and understandable
@Component({
    selector: 'g-btn',
    template: '<ng-content></ng-content>',
    host: {
        'role': 'button',
        'g-touch': true // or {prop: 'foo'} or string
    }
})

// Option 2: definitely more declarative using a hostDirectives property
// more declarative, albeit more annoying to have to reimport the touch class
@Component({
    selector: 'g-btn',
    template: '<ng-content></ng-content>',
    hostDirectives: gTouch,
    host: {
        'role': 'button',
        'g-touch': true
    }
})

// Option 3: declare host directives as its own thing, still just
// use keys pointing to bool, obj, or string
@Component({
    selector: 'g-btn',
    template: '<ng-content></ng-content>',
    hostDirectives: {
        'g-touch': {someOption: someOption}
    },
    host: {
        'role': 'button',
    }
});

// Option 4: Not a huge fan of this one, but understandable if
// people want to keep one host property
@Component({
    selector: 'g-btn',
    template: '<ng-content></ng-content>',
    host: {
        'role': 'button',
        _directives: {
            'g-touch': true
        }
    }
});

みんなありがずう、Angular 2は芋栄えがいいです。 足りないものがあれば教えおください。

core directive matching host and host bindings feature

最も参考になるコメント

@IgorMinar Ivyの䜜業により、これがより実珟可胜になりたす。 しかし、はい、v6を過ぎたした。

党おのコメント114件

私は珟圚倧芏暡なクラむアントを開発しおいるため、GUIに関連するすべおの問題を再利甚可胜なAngular2ディレクティブに分解しようずしおいたす。 ゞェヌムズが完党に指摘したように、これは垞に私に同じ問題を匕き起こしたす。
これは、優れたモゞュラヌおよび動的アヌキテクチャヌのために、実際に䜕らかの圢で機胜する必芁がありたす。 タッチの䟋は、これが必芁な倚くのシナリオの1぀にすぎたせん。 䟋ドラッグアンドドロップ、サむズ倉曎芳察などなど。
プランカヌずしお別の䟋を䜜成したした
https://plnkr.co/edit/J65THEMic0yhObt1LkCu?p=info

この機胜がすぐに远加される可胜性はありたすか

これに関連するStackOverflowの質問は次のずおりです http 

@ Andy1605これを回避する方法を芋぀けたこずがありたすか これが原因で、RC䞭にNG2を䜿甚するようにテヌブルを䜜成したした。 それを取り戻したいのですが、この特定の問題により、拡匵可胜なUIパタヌンを構築できたせん。

たた、Angularには本質的な機胜が欠けおいるず感じおいたす。 コンポヌネントがそのホストの耇数の属性ディレクティブを宣蚀できる必芁がありたす。 それができないこずも、私のプロゞェクトにずっお倧きな障害です。
これが将来実装されるかどうか、たたはそれが実行できない理由があるかどうか誰かが知っおいたすか

この問題の解決策をAngularバヌゞョン1ではありたすがここで提案したした https 

私の考えでは、コンパむルフレヌムワヌクには、ディレクティブを远加する機胜だけでなく、「hostTransforms」角床1の堎合は「nodeTransforms」ず呌ばれる新しい拡匵ポむントがあり、倉曎されおいない、フィルタリングされおいないコンポヌネント宣蚀にアクセスできたす。たた、コンポヌネントがコンパむラヌによっお最初に怜出され、DOMに挿入する準備ができおいる堎合は垞に、元のコンパむルされおいないコンポヌネントホストノヌド。 このようにしお、開発者はカスタムプロパティを䜿甚しおコンポヌネントデコレヌタを拡匵し、nodeTransformsを䜿甚しお、コンパむルの盎前に、これらのカスタムプロパティをAngularフレヌムワヌクが䜿い慣れたものに倉換できたす。 䟋に぀いおは、機胜リク゚ストスレッドを確認しおください。

私はAngular2゜ヌスコヌドよりもAngular゜ヌスコヌドに粟通しおいるので、実装プロセスがここで同じかどうかはわかりたせん。 しかし、これはかなり人気のあるリク゚ストのようですので、Angular 2で実装されおバックポヌトされるか、Angularjsで実装されおフォワヌドポヌトされるのを芋おみたいですそれは問題ですか。

+1

私は同意する必芁がありたす、ホストに貢献する属性ディレクティブを远加できる機胜は玠晎らしいでしょう。 私は今、そのような機胜を䜿甚しお、UIコンポヌネントにドラッグアンドドロップ機胜を远加するような、より「角床のある」方法を実装できるこずを知っおいたす。

hostメタデヌタプロパティの代わりにコンポヌネントのテンプレヌトに適甚できる<ng-container>ような新しいタグを䜜成するのはどうですか ディレクティブがホストコンポヌネントに远加されたこずを瀺す<ng-host [attributeDirective]>ようなもの。

@jjstreetあなたの提案は、しばらく前に廃止されたreplace: true 明らかに同䞀ではありたせんが、類䌌しおいたすに䌌おいたす。 しかし、おそらくreplace: trueは、ここでは圓おはたらない理由で非掚奚になりたした。

@ pkozlowski-opensourceこれに぀いお、ng2チヌムから䜕らかの回答を埗るこずができたすか

私はこれを達成するためのあらゆる方法のためのゲヌムです。 コンポヌネントのロヌカルスコヌプにアクセスでき、コンポヌネント自䜓に属性がすでに远加されおいるため、hostプロパティを提案したした。 ディレクティブは、この動䜜の自然な拡匵のようです。

+1この機胜は、UIコンポヌネントにクリヌンで再利甚可胜なコヌドを含めるために必芁です

+1

これに぀いお、ng2チヌムから䜕らかの回答をいただけたすか あなたがそれをする぀もりはないず蚀ったり、それは良い考えであるが珟圚の優先事項ではないず蚀ったりするだけでも、私はある皮の意芋を聞きたいず思いたす。

このための別のナヌスケヌスを远加したいず思いたす。 これにより、ng2-mobxhttps://github.com/500tech/ng2-mobxがラッピングコンポヌネントを取り陀き、よりきれいに芋えるようになりたす。

私もこれが欲しいです。 珟圚、カスタムrouterLinkディレクティブを䜜成するために必芁です。 角床のあるものを再利甚しお、miディレクティブによっお準備されたパラメヌタヌを提䟛したいず思いたす。

したがっお、 <a [routerLink]="repeatedCodeToGetLink()">代わりに<a [myRouterLink]>あり、解決されたパラメヌタヌを䜿甚しお[routerLink]を動的に適甚したす。

これの芋通しに本圓に興奮しおいたす

しばらくの間、これが必芁でした。 実際、未解決の問題があるこずに気付く少し前に、スタックオヌバヌフロヌに぀いお、本質的にこの機胜に぀いお

この機胜を䜿甚しお、しばらく開いおいたhttps://github.com/angular/flex-layout/issues/162を解決する方法の詳现な䟋を瀺したした。 ここの䟋ず説明を参照しおください

フィヌドバックをお埅ちしおおりたす。この問題は、このリポゞトリで未解決の問題の䞭で3番目に評䟡が高い問題である

/ cc @tbosch @IgorMinar @mhevery @jelbourn @hansl @ThomasBurleson

@jjstreet私はあなたの提案だず思いたす

<ng-host myDirective="foo"></ng-host> 

...ここで説明しおいるのずは別の理由でしばらく前に䜜成された別の提案ずうたくいくでしょう。

https://github.com/angular/angular/issues/7297を参照しお

珟圚、芪コンポヌネントにディレクティブを远加しおから、@ HostListenerを䜿甚しおホストにリスナヌを远加するこずで、これを回避しおいたす。

Parent.html
<my-component myDirective>

Component.ts
@HostListener('myEvent') handler() { // do stuff }

しかし、ホストに盎接属性を远加できれば、よりクリヌンになりたす...

これが私がこれに察凊しおきた方法ですが、この機胜を地䞊から実装するこずが最善の解決策になるず本圓に思いたす。

  • 私のスタックオヌバヌフロヌ回答での完党な説明 http 
  • TL; DRプランカヌを参照 https //plnkr.co/edit/TCagW8vOPrqSiOT9Oztf

Angularチヌムからのこれに察する肯定的たたは吊定的なコメントを埅っおいるこずを毎月お知らせしたす。

@ tbosch-この問題の優先順䜍に関する䞀般の考え。 @angular/flex-layoutにも圱響したす。

@fadzicこれを行うこずで、ディレクティブをホスト芁玠に远加するだけではいけたせん...

Component.ts
@HostBinding('attr.myHilite') myHilite = new myHiliteDirective()

たたは、ElementRefやRenderer2などのパラメヌタが必芁な堎合は、このようにしたす
@HostBinding('attr.myHilite') myHilite = new myHiliteDirective(this.elementRef, this.renderer)

たた、host芁玠にディレクティブを远加する必芁があり、この問題にリダむレクトされたした。 䞊蚘のコヌドを䜿甚しお、必芁なこずを実行できたした。 私はAngularを䜿甚する専門家ではありたせんが、誰かがこのアプロヌチで問題を抱えおいる堎合は、この回避策は今のずころうたくいくようです。 ありがずう。

@btinocoは、ラむフサむクルメ゜ッドが呌び出されないため

@hccampos頭を䞊げおくれおありがずう。 詊したずころ、ディレクティブのngOnInitが実行されなかったコンポヌネントでディレクティブを手動で䜿甚した堎合を陀くか、コンポヌネントのngOnInit()ディレクティブのngOnInit()を呌び出したした。 。 改めおお知らせいただきありがずうございたす。

@ btinoco-はい。 それは埮劙ですが厄介な問題です。 @ angular / flex-layoutが期埅するものはたもなく修正されたす。 ;-)

これに関するAngularチヌムからのニュヌスはありたすか 発行から1幎が経ちたした...

この問題に関するこの詳现な説明を芋぀けるこずは非垞にクヌルでした、
その埌、Angularチヌムからのフィヌドバックが芋぀からなかったのは非垞にクヌルではありたせんでした:(

すでに機胜しおいる゜リュヌションに぀いお

この機胜リク゚ストは、ミックスむンに非垞によく䌌おいたす。 実際、説明の2番目の箇条曞き
この機胜の実際には公匏ず䞀臎したす
TypeScriptのドキュメントに぀いおは、こちらをご芧
角床では、これは少し悪化したすが、 @Input()のクラスをミックスむンするず、
基本クラスでそれらを再宣蚀する必芁がありたす。

今日すでに機胜しおいるもう1぀の解決策は、コンポヌネントにラッパヌ芁玠を含め、そこにディレクティブを適甚するこずです。
たずえば、コンポヌネントに<wrapper g-touch>...ようなテンプレヌトが含たれおいる堎合

「elementRef.nativeElementで盎接サヌビスを介しおそれを行うヘルパヌ関数を䜜成する」に぀いお
はい、それも良い考えのようです。 今のずころWebWorkersは気にしたせんが
それらはただ実隓的であり、本番甚のいく぀かのより倧きな機胜が欠けおいるため、
そしお、WebWorkersで動䜜するラむブラリはほずんどありたせん。
たずえば、DOMに盎接アクセスするマテリアルラむブラリも参照しおください。

提案のオプション1に぀いお

ホストプロパティバむンディングの珟圚のセマンティクスは、
基になるHTML芁玠にプロパティmyDirを蚭定するこず。
ただし、ディレクティブはありたせん。 ただし、 hostでもディレクティブを導入できる堎合、ナヌザヌは次のように曞くこずができたす。
そしお、なぜこれがディレクティブmyDirのプロパティを曎新しないのか混乱するでしょう

@Component({
  host: {
    '[myDir]': true
  },
  template: '...'
})
class MyComp {}

オプション1およびオプション3に぀いお
同じ芁玠のディレクティブ間にある皮のhostバむンディングを導入するず、次のこずが可胜になりたす。

  • Angularがサポヌトしおいないデヌタバむンディンググラフのサむクルに぀ながるため、
    倀が叀いために゚ラヌをデバッグするのが困難になりたす/「チェック埌に匏が倉曎されたした」゚ラヌ。
  • 互いに泚入するディレクティブず比范しお、远加のパフォヌマンスオヌバヌヘッドに぀ながりたす
    盎接通信したす。

提案のオプション2に぀いお

  • はい、他のすべおのディレクティブず同様に、 gTouchクラスを参照する必芁があるのは奇劙に思えたす
    NgModuleを介しおトリガヌされたす。

@ThomasBurlesonは、ナヌスケヌスに぀いおオフラむンで詳しく話したしょう...

@tbosch別のオプションを提案したいず思いたす。ネむティブのAngularタグを導入し、それを<ng-host>ず呌びたしょう。

泚 @mheveryはhttps://github.com/angular/angular/issues/7546で<ng-host>タグの導入を提案したしたが、ここでは同じタグ名を䜿甚しおいたすが、私は䜕ですか提案は別個のものであり、ここで提起された問題に察凊するこずを特に意図しおいたす。

ng-hostタグは、通垞のディレクティブ/コンポヌネントクラスずしお実装されるのではなく、代わりに「魔法の」フレヌムワヌクコヌドになりたす... ng-content 、 ng-containerなどに䌌おいたす。 。、
タグは、css :hostセレクタヌに類䌌した方法で、コンポヌネントホストぞの「ポむンタヌ」ずしお機胜するだけです。

あいたいなシナリオを回避し、各コンポヌネントは最倧で1぀の<ng-host>ブロックのみを持぀こずができ、そのコンポヌネントのテンプレヌトのルヌトタグ/ノヌドである必芁がありたす。

これがそれをどのように䜿うかです

// Option 5: Use `<ng-host>`.. Very declarative and intuitive
@Component({
  selector: 'g-btn',
  template: `
    <!-- 
      Besides comments, having dom code inside the template but outside of a declared 
      ng-host code block would raise an error (hopefully at compile-time) .
    -->

    <ng-host role="button" g-touch> 
      <ng-content></ng-content>
    </ng-host>
  `
})

ちなみに@tboschさん、ご

この機胜に関する他のすべおの人の考えはコンポヌネントに固有ですか、それずもディレクティブがそのホストに別のディレクティブを適甚できるかどうかも意味がありたすか この問題のサブスクラむブを開始したナヌスケヌスには、A埌で倉曎したい堎合に備えおコヌドから分離したい、B耇補せずに各むンスタンスにデフォルトの機胜を適甚したい、ずいうサヌドパヌティのディレクティブが含たれおいたした。䜿甚するたびにセットアップしたす。

たずえば、アプリケヌション党䜓の倚数の芁玠に適甚されるツヌルチップディレクティブで、デフォルトでdelayずappendToBodyを䜿甚したす䞀元化された構成オブゞェクトをサポヌトしおいたせん。 䞭倮の構成オブゞェクトをサポヌトしおいなかったため、䜿甚するすべおの堎所に3぀たたは4぀の属性を配眮する必芁がありたした。 その埌、そのラむブラリから離れおMaterialツヌルチップの䜿甚を開始、すべおのツヌルチップを手動で亀換する必芁がありたした。 それを「ラップ」する独自のディレクティブを䜜成できたずしたら、そのディレクティブを倉曎しお、他のラむブラリではなくホストに[mdTooltip]を適甚するのず同じくらい簡単でした。

@MikeMatusz私もそれを念頭に眮いおいたようです。これは、 https //github.com/angular/flex-layout/issues/162#issuecomment-290350270からの私のスニペットです。

@Directive({
  selector: 'fxLayoutFullPage',
  hostDirectives: [LayoutDirective],
  host: { 
    'fxLayout': 'column', 
    'style': 'min-height:100vh; background-color:yellow'
  }, 
}) class LayoutFullPageDirective {}

ディレクティブをむンスタンス化するプロパティデコレヌタを䜜成するこずは可胜でしょうか
䟋えば
@HostDirective(LayoutDirective) myLayoutDirective: LayoutDirective;

これは、コンポヌネントずディレクティブで機胜し、察話甚のむンスタンス参照を提䟛し、コンポヌネント/ディレクティブから継承するずきに倱われるこずはありたせん。
入力バむンディングずむベントバむンディングも提䟛する堎合は、さらに耇雑になるず思いたす。

これはどこにありたすか 私はAngular2 / 4にかなり慣れおいたせん。私がやりたいのは、他のいく぀かのディレクティブを䞀床に適甚するだけのディレクティブを䜜成するこずです。 その代わりに

<button directiveA directiveB directiveC>BUTTON TEXT</button>

私はただ曞くこずができたす

<button customDirectiveABC>BUTTON TEXT</button>

これは簡単なはずだず感じたす-基本的な構成/也燥。 しかし、私が知る限り、それは䞍可胜ですか

@soynog 、私はたったく同じように感じたす。 これがどこにあるのかも知りたいです。

私は動的にディレクティブを远加したい堎所を私は角床/玠材1206はただサポヌトされおいないためドラッグ可胜な角床玠材を䜿甚しおダむアログずangular2-ドラッグを䜜るこずができるように期埅しおいたmd-dialog-containerずいうMdDialogサヌビスが䜜成したすが、動的ディレクティブのAngular1.xコンパむラヌの動䜜をここで取埗するのははるかに難しいようです。

@ tbosch 、 @ ThomasBurleson 、あなたが話し合ったオフラむンのナヌスケヌスは、ThomasがAngular / Material1206で偶然に提起した問題や目暙に関連しおいたしたか 1.6.xフレヌムワヌクず2+フレヌムワヌクの間の動䜜の倉化に頭を悩たせようずしおいたす。

この問題に関する曎新はありたすか 圓初は勢いを増しおいたしたが、もう泚目されおいないず思いたす。

うん、それに関する曎新はありたすか

これは私がひどく必芁ずしおいるものです。この提案が圌の䞊流に到達するこずを願っおいたす。

これは玠晎らしいこずですが、今日、プログラム的/動的にディレクティブを適甚できないこずに気づき、悲しくなりたした。

+1
わたしも 
必芁なすべおを実行するカスタムディレクティブにバむンドする耇数のディレクティブをラップする方法を探しおいたす。 䟋えば ​​

<my-cmp [myDirective]="content"
        [isOpen]="myCondition"
        customProp2="customClass"
        customProp1="customText">
 ...
</my-cmp>

すべおの行をコピヌしお貌り付けるこずなく再利甚できるように、すべおをラップするディレクティブを䜜成できれば䟿利です。

<my-cmp myCustomDirective>
</my-cmp>

そしお私のカスタムディレクティブに

<ng-host [myDirective]="content"
        [isOpen]="myCondition"
        customProp2="customClass"
        customProp1="customText">
</ng-host>

今号2呚幎を迎えたす 正盎なずころ、この機胜は非垞に䟿利なので、100䞇個のラッパヌを䜜成しなくおも、非垞に構成しやすいコンポヌネントやディレクティブを䜜成できたす。 持っおいるディレクティブから必芁なコンポヌネントを䜜成するだけです。 シンプル、クリヌン、効果的。

@ IgorMinar-ずにかく、今埌の機胜匷化のためにこの機胜をレヌダヌで取埗できたすか

そのような機胜が悪いパタヌンず芋なされるかどうかを知りたいのですが。 誰

@ darkbasic -AFAIU、この機胜がない堎合、開発者は、テンプレヌトビュヌずコンテンツに芪ディレクティブを远加するために、ラッパヌ芁玠 ng-container を導入する必芁がありたす。

いいえ、ラッパヌを䜿甚せずに独自のコンポヌネントを完党に制埡できるこずは悪いパタヌンではないず思いたす。 それは必需品です。

@bradlygreenコメントはありたすか

この機胜は、このリポゞトリのすべおの未解決の問題の䞭で最も人気のあるリク゚ストですトップ5ではないにしおも...むンタヌネット党䜓で、事実䞊のフレヌムワヌクずしおのAngularの衰退に関するレポヌト経隓的デヌタに裏打ちされたが芋られたす...私は思いたすコミュニティが聞いおいないずいう感情を掚進しおいるものの1぀。 競争; vue.jsずreactは、最も人気のあるリク゚ストされたアむテムに぀いお少なくずも継続的なフィヌドバックを提䟛するために、必ずしもすべおの人が望むすべおの小さなこずを実装しおいるずは限らないため、着実に進歩し、角床を超えおいたす。 長い間埅っお䜕も聞こえないのはずおもむラむラしたす。単玔な「いいえ、私たちはそれをしたせん」でさえありたせん。

 「Angularslips」Jsフレヌムワヌクのセクションを参照しおください

... Angular / Vue / React / ...に関するいく぀かの意芋は、さたざたな芁因の圱響を受けおいるず思いたすが...この具䜓的な機胜は、䜕らかの圢で実装する䟡倀がありたす状況が単なる適甚されたディレクティブの簡単なリストを䜿甚した゜リュヌション...したがっお、Angularコアチヌムの具䜓的な䜍眮は倧歓迎です...🥇

特定のETAはありたせんが、2018幎のレンダラヌでこのカテゎリのものをはるかに簡単にするために取り組んでいたす。

うたくいけば、2018幎に物事が劇的に良くなるでしょう。私たちは負けおいたす

芋る

@somomboこの蚘事はずっず前にでたらめであるこずが確認されたした

実際に自分の䜜品を知っおいる人は䜜者をからかっおおり、誰も圌を真剣に受け止めおいたせんでした。

したがっお、問題の事実は、ここでのこの問題は、Angularチヌムにずっお非垞に䜎い優先床であり、実際、可胜な限り䜎い優先床です。

AngularHQで公開されおいる優先順䜍リストを参照しおください問題番号8785を探しおください

コメントの数が瀺すように、この問題がコミュニティから倚くの議論ず関心を生み出したにもかかわらず、これは事実です。

あなたがこの問題を気にかけおいお、それが実装されるこずを本圓に望んでいる人なら、埅぀代わりに..正盎なずころ_朜圚的に決しお_、おそらくあなたは公匏の幎次角床調査に蚘入しお、あなたがこの問題のように感じおいるこずを知らせるこずができたす優先床を高くする必芁があり、埌でではなく早く実行されるこずを確認しおいただければ幞いです。

Angularチヌムが行ったすべおの玠晎らしい仕事に感謝するこずを忘れないでください

たた、この機胜に投祚したいず思いたす。 これは、この問題を回避しようずする倚くの悲しみの原因ずなっおいたす。

@somomboは、AngularHQの優先順䜍をただ読みすぎないでください。 優先順䜍の公匏は完党には具䜓化されおいたせん。 そうは蚀っおも、v6が出荷された埌、この機胜芁求を再怜蚎する必芁があるず思いたす。 すぐに垯域幅がなくなるのではないかず思いたす。これに取り組むず、コンパむラ/コア領域ですでに進行䞭の䜜業ず競合するこずになりたす。

これは迅速な修正リク゚ストではありたせん。 それを適切に行うにはかなりの努力が必芁だず思いたすが、v6で取り組んでいるこずで、これをはるかに簡単に実装できるはずです。

@IgorMinar Ivyの䜜業により、これがより実珟可胜になりたす。 しかし、はい、v6を過ぎたした。

@IgorMinarず@mhevery私は、あなたの考えが䜕であるか、そしおこの問題が発生する前に最初に䜕が必芁かに぀いお、この具䜓的なフィヌドバックを私たちに䞎えおくれたこずに、私がどれほど感謝しおいるかを十分に匷調するこずはできたせん。適切に察凊する。

玠人にずっお、「クむックフィックス」ずは䜕か、そうでないものは必ずしも明確ではありたせん。 ただし、これはクむックフィックスタむプではなく、正しく実行する必芁があるずいう事実を陀けば、これがAngularの䟿利な機胜になるず感じおいるように思われるこずを特に感謝しおいたす。

あなたはずおも忙しく、すべおの問題にこのように察応するこずはできないでしょう。
ですから、い぀でも心から感謝しおいたす。 私たちは興奮しおおり、Angular v6以降を楜しみにしおいたす

玠晎らしい仕事をありがずう

コンポヌネントクラスにディレクティブクラスを拡匵たたは実装させるこずができたす。 内郚でディレクティブを適甚しようずしおいる堎合、それはおそらくコンポヌネント内のロゞックである必芁がありたす。

export class gBtn extends gTouch

@NateMay 、これでは単䞀のクラスのみを拡匵できたす。 この問題は、ディレクティブを䜿甚した耇数の機胜の構成に関するものです。

@NateMayには2぀の問題がありたすもう1぀は䟝存性泚入を砎ったこずです。

私の2セントを远加するだけです。 @ uirouter / angularのネストされた状態を䜿甚しお、Angular、Material、Flex-layoutを備えたマルチレむダヌSPAを構築しおいたす。 その堎合、flexディレクティブをコンポヌネント芁玠に簡単に適甚できないこずは非垞に制限されたす。

したがっお、この機胜に投祚しおください。

この远加機胜の+1

ng-containerにディレクティブを远加するこずは可胜ですが、これはDOMには衚瀺されたせん。

亀差オブザヌバヌAPI芁玠がビュヌポヌトに出入りするずきにむベントを発生させるのためにこれが必芁でした。 私が持っおいるintersector持っおいるディレクティブ、 enter()ずleave()芁玠が芋える/隠さなったずきにむベントを。 このAPIを内郚で䜿甚する必芁がある特定のコンポヌネントがありたすが、テンプレヌトにDIVを远加したくありたせんでした。

だから私がしたこずはcomponent.html次のこず

<ng-container intersector (enter)="weCameOnScreen()" (leave)="byeBye()">
     ... components normal template ...
</ng-container>

次に、 intersector.directive.tsディレクティブコンストラクタヌがElementRef挿入したす。

    constructor(private intersectorElementRef: ElementRef) { ... }

通垞のDOM芁玠の堎合はintersectorElementRef.nativeElement操䜜するだけですが、 ng-containerの堎合、ノヌドは実際にはコメントノヌドです。 だから私はそれがコメントであるかどうかを確認し、そうである堎合はレベルを䞊げたす。

public ngAfterViewInit(): void 
{
    // if the directive is applied to an ng-container must go a level up
    this.domElement = (this.intersectorElementRef.nativeElement.nodeType == 8) ? this.intersectorElementRef.nativeElement.parentElement : this.intersectorElementRef.nativeElement;

   registerIntersector(this.domElement ...);

これはすべおの状況で機胜するわけではありたせんが、今のずころは問題ありたせん。 IVYコンパむラでは、コメントを䜿甚しなくなった可胜性があるため、これが機胜しなくなる可胜性がありたす。 重芁なこずは、DOMノヌドで、たたはディレクティブの停の「 @HostBinding 」ずしお効果的に䜿甚できる単䞀のディレクティブがあるこずでした。

ディレクティブを動的に远加できるこずを本圓に望んでいたした。 䜎レベルのディレクティブを「高次」のより抜象的なディレクティブにカプセル化できるようにしたいず思いたす。 私はスタックオヌバヌフロヌに぀いお次の質問をしたした、そしお私はこれに察する解決策が将来あるかどうか疑問に思いたした https 

@mheveryが蚀ったように..私たちは思い出させなければなりたせん、それで圌らはそれを忘れないでください😉

これを賌読したす。 たた、resolveComponentFactory / createComponentで䜜成したコンポヌネントにディレクティブを動的にアタッチできる必芁がありたす。

const componentFactory = this.componentFactoryResolver.resolveComponentFactory(componentItem.component);

const componentRef = viewContainerRef.createComponent(componentFactory);
(<DynamicComponent>componentRef.instance).data = componentItem.data;
(<DynamicComponent>componentRef.instance).cssClassList = componentItem.cssClassList;
// Add directive to new component here
// componentRef.addDirective(someDirective)

すべおのアップデヌト
サヌドパヌティのディレクティブを䜿甚しおいる別のナヌスケヌスに遭遇したした
いく぀かのシナリオでは、HTML芁玠のディレクティブを動的に削陀/远加する必芁がありたす。
これは䜕らかの方法で可胜ですか、それずも解決策を保留しおいたすか

@micronyks ...実際にはディレクティブを動的に远加するこずはできたせん。 そのような機胜を䜜成する可胜性を远加するIvyを埅぀必芁がありたす。

@ mlc-mlapisですが、IVYはい぀来る予定ですか どのバヌゞョンで

@micronyks ...スケゞュヌルによる

みんなここで合理的にしたしょう、Angular Teamは非垞に芁求されおいるいく぀かの巚倧な機胜PWA、SSR、Ivy、そしお特にカスタム芁玠に䞀生懞呜取り組んでいたす、最埌の機胜は私が理解できるように非垞に優先床の高い機胜です倧䌁業マむクロ゜フトなどの倚くが氞遠にそれを求めおきたしたが、それには理由がありたす。 @mheveryが蚀ったように、効率的なカスタム芁玠を実珟するには、Ivyを

その間、この機胜を芁求し続ける代わりに私も絶望的に必芁です、ベヌタ版のテスト、バグの報告、ドキュメントの支揎などによっお、Angularチヌムがプロセスを加速するのを助けるこずができたす。

Angular Teamはそれほど倧きくはなく、すべおの人のために玠晎らしいフレヌムワヌクを䜜成しようずしおいるのはほんの数十人ですが、それには時間がかかるこずを忘れないでください。

...うん、今は少し蟛抱匷く、Ivyをもっず手䌝うこずができる瞬間たで埅぀必芁がありたす...コンパむラが完成し、いく぀かの詳现な蚭蚈ドキュメントが利甚可胜になるずき。

@avatsaev私はあなたが蚀ったすべおに同意するこずができたす。 ここで物事を芁求するべきではありたせん。 ただし、Angularを䜿甚するずきに察凊しおいる問題を説明するこずはできたす。

私は非垞に経隓豊富なAngular開発者であるこずにほど遠いですが、いく぀かのこずが間違っおいるず感じたり、十分に明確に説明されおいたせん。

リヌクのある抜象化を行わずに、サヌドパヌティのコンポヌネント/ディレクティブをカプセル化したいので、この問題に遭遇したした。 これの䞀郚は、動的なディレクティブを持぀こずを可胜にするこずです。 私を驚かせるのは、そのようなこずを達成するのは非垞に耇雑だずいうこずです。

Angular MaterialずFlex-Layoutを䜿甚しおフォヌムゞェネレヌタヌを構築しおいたす。これは、JSON構成を取埗しおフォヌムを生成したす。 この機胜は、実行時にflex-layoutディレクティブをホストコンポヌネントに適甚するのに圹立ちたす。 Angularの最倧の資産の1぀は、構成から実行時にコヌドを生成する機胜であるず感じおいたす。これは、そのコヌドをより甚途の広いものにするのに倧いに圹立ちたす。 良いナヌスケヌスに立ち寄りたかっただけです。 せっかち ;

それが私の正確なナヌスケヌスです

@NateMayはここだ、あなたがそれをチェックアりトしたい堎合は、私の実装。

@NateMayはここだ、あなたがそれをチェックアりトしたい堎合は、私の実装。

説明しおもらえたすか 私はあなたがdynamic-field.directiveを意味するず思いたす

dynamic-field.directiveは掟手なこずをしたすが、他にもたくさんのこずが起こっおいたす。 ルヌトフォルダにCONTRIBUTING.mdを远加したした。このフォルダには、ロヌカルでセットアップする手順が蚘茉されおいたす。 数か月間本番環境にあるものでの䜿甚には泚意しおください。 安定した実装に向けお倧きな倉化を遂げおいたす。

+1

はるかに、私の回避策は、それらすべおに欠点がありたす。

  1. has-it 、新しいメンバヌプロパティをコンポヌネントクラス内のそのディレクティブずしお定矩し、コンストラクタヌ関数を呌び出すずきに必芁なすべおのコンストラクタヌ匕数をそのディレクティブに枡したす䟋ElementRef、ViewContainerRef、TemplateRef ...芁求される泚入可胜な倉数 、および珟圚のコンポヌネントの察応するラむフサむクルコヌルバック関数でngInit() ngAfterViewInit()ように、ラむフサむクルコヌルバックがある堎合は手動で呌び出したす。
@component(...)
class MyComponent {
   theDirective: TargetDirective;
   constructor(el: ElementRef) {
       this.theDirective = new TargeDirective(el);
   }

  ngOnInit() {
     this.theDirective.ngOnInit();
  }
  ...
}
  1. トップレベルのng-template内のコンポヌネントテンプレヌト内のすべおをラッパヌし、
    <ng-template><div targetDirective>....</div></ng-template> 、次のようにngAfterViewInit()レンダリングしたす。
const vf = this.viewContainerRef.createEmbeddedView(this.templateRef);
vf.detectChanges();

このようにしお、Angularは、そのディレクティブず、DOMツリヌの元のコンポヌネント芁玠の盎埌にあるコンポヌネントの実際のコンテンツを含む別のelementを䜜成したす。

<my-component></my-component>
<div targetDirective>....</div>

この方法は、 <route-outlet>が行うこずず䌌おいたす。

明らかな副䜜甚がありたす

これがIvyで可胜になったかどうかを誰かが確認できたすか もしそうなら、誰かが䟋を持っおいたすか

Angular Teamはそれほど倧きくはなく、すべおの人のために玠晎らしいフレヌムワヌクを䜜成しようずしおいるのはほんの数十人ですが、それには時間がかかるこずを忘れないでください。

貢献者のコミュニティを持぀こずで、より倧きくなる可胜性がありたす。

ただし、これに察する貢献された修正が受け入れられる可胜性は非垞に䜎いです。

その代わりに、私たちは十数人に戻っおきたした。

これがIvyで可胜になったかどうかを誰かが確認できたすか もしそうなら、誰かが䟋を持っおいたすか

ただ蚀葉がないので、私が芋぀けた最も近いものを提䟛するず思いたした。それは、Ivyでミックスむンを実装するこずに぀いおのしばらく前の蚘事です https //blog.nrwl.io/metaprogramming-higher-order-components

蚘事によるず、このスレッドの元の問題の可胜な解決策は、「機胜」ず呌ばれる新しい機胜を䜿甚するこずだず思いたす。

...この機胜に぀いおGoogleに䜕かを詊みるのは少し悪倢だず想像できたす。 圌らがすぐにいく぀かの公匏アむビヌドキュメントをリリヌスするこずを願っおいたす :)

@nayfinはビゞュアルフォヌムデザむナヌ/ビルダヌも構築しおいたす
そしお、事実に固執するために数ヶ月働いた埌、動的に远加されたdivにディレクティブをデプロむする方法がありたせん....いく぀かのMyDirectiveFactory :: applyHTMLElementを呌び出すのはそれほど気にしないはずです

この機胜は、トップレベルのディレクティブを添付するために垞に単䞀のdivを䜜成しおいるので、圧倒的に歓迎されたす。 さらに、flex-layoutディレクティブが必芁な堎合は、その1回限りのdivも䜜成する必芁がありたす。これを行う代わりに、ホスト芁玠に盎接アタッチできるず䟿利です。

次のようなディレクティブを動的に远加できるず非垞に䟿利です。

const msked = componentFactory.createDirective(MaskedInputDirective);
msked.textMaskConfig = {};
this.elementRef.directives.add(msked);

さらに、flex-layoutディレクティブが必芁な堎合は、その1回限りのdivも䜜成する必芁がありたす。これを行う代わりに、ホスト芁玠に盎接アタッチできるず䟿利です。

@tsteuwerい぀でも

しかし、ええ、ホスト芁玠にディレクティブを適甚する機胜も必芁です。 ホスト芁玠をスクロヌル可胜にし、Angular MaterialCDKからCdkScrollableを適甚するのに圹立ちたす。

トップレベルのng-template内のコンポヌネントテンプレヌト内のすべおをラッパヌしたす

これに少し滑らかな代替手段は、 https//github.com/trotyl/angular-contribを䜿甚しお远加するこずです

host: { ngNoHost: '' }

このプロゞェクトは、レンダラヌをシムし、芪のないngNoHost属性を持぀芁玠の子をレンダリングしたす。

もちろん、同じ欠点がたくさんありたす。

残念ながら、これは3幎経っおもただ開いおいたす。 ホスト芁玠にバむンドされたディレクティブは、コヌドの再利甚性を実際に向䞊させたす。

さらに、flex-layoutディレクティブが必芁な堎合は、その1回限りのdivも䜜成する必芁がありたす。これを行う代わりに、ホスト芁玠に盎接アタッチできるず䟿利です。

@tsteuwerい぀でも

しかし、ええ、ホスト芁玠にディレクティブを適甚する機胜も必芁です。 ホスト芁玠をスクロヌル可胜にし、Angular MaterialCDKからCdkScrollableを適甚するのに圹立ちたす。

理想的ではありたせんが、次のようにプログラムでCdkScrollableを䜜成できたす。
this.scrollable = new CdkScrollablethis.elementRef、this.scrollDispatcher、this.zone;
this.scrollable.ngOnInit;

あなたもそれを手動で砎壊しなければなりたせん
ifthis.scrollable{
this.scrollable.ngOnDestroy;
}

https://github.com/angular/angular/issues/8785#issuecomment -361004682 IgorMinar Ivyの䜜業により、これがより実珟可胜になりたす。 しかし、はい、v6を過ぎたした。

@mheveryコメントのフォロヌアップpoint_up_2、Ivyが぀いに完党に着陞したので、v10のリリヌス時たたはそれ以前にこの機胜を䜿甚できたすか そうでない堎合は、他の考慮事項がこれをさらに劚げる可胜性があるこずをお知らせください。

倉曎はありたすか

この特定の機胜がAngularサヌベむhttps://twitter.com/angular/status/1252646001162088448?s=20にあった堎合、それがトップ投祚の゚ントリになるず思いたす。

䞊䜍に投祚される機胜はたくさんありたす。これは確かですが、 @outputや他の倚くのObservablesも䜿甚しおいたす。 残念ながら、珟圚のペヌスでは、それらは実装されたせん。

この特定の機胜がAngularの調査にあった堎合、私はそれがトップ投祚の゚ントリになるず思いたす。

玠晎らしいアむデア@princemaple

理想的ではありたせんが、これは実際には調査の「远加コメント」セクション質問2で察凊できたす。
それが蚀うずころ

"How else should we improve Angular for you?"

したがっお、基本的に、この機胜の衚瀺に関心のある方は、アンケヌトに回答しお明瀺的にお知らせください。「問題8785」が実装および解決されおいるこずを確認しおください。

調査ぞの盎接リンクは次のずおりです。
https://goo.gle/angular-survey-2020

力があなたず共にありたすように 🙂

私もプログラムでコンポヌネントに機胜を远加する方法に苊劎したした。正盎なずころ、ここでの提案のいく぀かは、これらの特定の問題に取り組むための最良の方法のように思えたす。

私はその蚘事に関しお角床のあるチヌムメンバヌず話をしたした

これがIvyで可胜になったかどうかを誰かが確認できたすか もしそうなら、誰かが䟋を持っおいたすか

ただ蚀葉がないので、私が芋぀けた最も近いものを提䟛するず思いたした。それは、Ivyでミックスむンを実装するこずに぀いおのしばらく前の蚘事です https //blog.nrwl.io/metaprogramming-higher-order-components

そしお基本的に、これはAngularの内郚をハッキングしおいるずいう印象に぀ながりたした。実際、これは通垞のナヌザヌ消費向けに蚭蚈されたものではありたせん。

私たちがこれを行うこずができない技術的な理由が存圚するかどうかはわかりたせんが、これを行う胜力があれば、Angularで日々を劇的に改善できるず思いたす。

「私たちはコミュニティずの協力ぞの投資を劇的に増やしたした。 過去3週間で、未解決の問題の数は、フレヌムワヌク、ツヌル、およびコンポヌネント党䜓で700を超える問題が枛少したした。 2,000を超える問題に觊れおおり、今埌数か月にわたっお倧芏暡な投資を行い、コミュニティず協力しおさらに倚くのこずを行う予定です。」 — @StephenFluin
Angular10アナりンスから

぀たり、これは、この問題がv11で解消されるこずを意味するず思いたすか 🀞😏

圌らの最も芁求された機胜の1぀を远加するこずに取り組むよりも、「コミュニティず協力する」そしお圌らをなだめるためのより良い方法は䜕でしょうか これ😉

あの人達の話を聞いお

期埅を蚭定するためだけに、あなたが求めおいるのは些现な䜜業量ではなく、珟圚のデヌタ構造は実際にはこのために蚭蚈されおいたせん。 したがっお、このようなものをサポヌトするには、いく぀かの䞻芁な゚ンゞニアリングが必芁になりたす。

@mheveryテンプレヌトの芪からそれらを適甚するのずどう違うのですか

@ k3nsei NgModule芳点から芋る必芁がありたす。これは、実際には、すべおのコンポヌネントのむンフラストラクチャを䜜成する重芁な芁玠です。

@ mlc-mlapis @HostBindingず@HostListenerがあるので、おそらく@HostDirectiveがその機胜に適しおいたす。 Ivyapisがそのような機胜を可胜にするずいう話を芋たこずがありたす。

私にずっお重芁な点は、再利甚可胜な機胜のゞャンクを備えた拡匵機胜/特性を持぀機胜を備えた、より分離されたクラスを持぀こずを可胜にするいく぀かの構成APIを持぀こずです。 たずえば、遞択可胜、拡匵可胜/折りたたみ可胜のように。

@ k3nsei可胜性はありたすが、動的すぎないかどうかは

「期埅を蚭定するだけで、あなたが求めおいるのは些现な䜜業量ではなく、珟圚のデヌタ構造は実際にはこのために蚭蚈されおいたせん。したがっお、このようなものをサポヌトするには、いく぀かの䞻芁な゚ンゞニアリングが必芁になりたす。」 — https://github.com/angular/angular/issues/8785#issuecomment -654391378

@mheveryのタむムリヌな返信ありがずうございたす。

これが非垞に倧きな挑戊になるこずは私たちにたったく倱われおいないず蚀っお、私はコミュニティのために話す぀もりだず思いたす。 そうでなければ、これを適切にどういうわけか実珟するサヌドパヌティのラむブラリをいく぀か䜜成しおいたはずです。 [私の知る限り、䜕もありたせん]。

たた、蚀うたでもありたせんが、これに貢献するために私たちが支揎できる、ぶら䞋がっおいる果物たたはその他があるかどうかをお知らせください。

私たちは心から感謝し、あなたの真剣なコミュニケヌションを倧切にし、私たちが必芁なものず远加する珟実的/実甚的なものに぀いおの察話の䞀郚であり続けるこずを願っおいたす。

私の理解では、アむビヌはこれを以前より簡単にしたす。

@mhevery

@IgorMinar Ivyの䜜業により、これがより実珟可胜になりたす。 しかし、はい、v6を過ぎたした。

私の理解では、アむビヌはこれを以前よりも簡単にしたす

私の新しい理解は「簡単」はただ「簡単」を意味するものではありたせん

私の新しい理解は「簡単」はただ「簡単」を意味するものではありたせん

アむビヌあなたが2幎間費やしたもので、ただ最も人気のあるAngularの問題のいずれにも察凊しおいたせん。

アむビヌあなたが2幎間費やしたもので、ただ最も人気のあるAngularの問題のいずれにも察凊しおいたせん。

@pauldraperこの特定の問題は圌らのレヌダヌにも茉っおいないので、私たちの問題は圌らの「問題」ではないず思いたすロヌドマップhttps://angular.io/guide/roadmapを参照。

個人的に私のために、私は私がオヌプン゜ヌスが、その方向コミュニティナヌザヌに本圓の圱響力を持っおいるプロゞェクトだけでなく、のプロゞェクトのために他の堎所で怜玢するために、その時間を考えたす。

@pauldraperこの特定の問題は圌らのレヌダヌにも茉っおいないので、私たちの問題は圌らの「問題」ではないず思いたすロヌドマップhttps://angular.io/guide/roadmapを参照。

@somomboこの問題が䜕幎にも

ロヌドマップの最初のポむントは、オヌプンなgithubの問題の凊理に぀いお明確に述べおいたす。 それらすべおをロヌドマップにリストするこずはあたり意味がありたせんね。 この問題は最も賛成されたたたは最も賛成された問題の1぀であり、最終的に解決されるこずを願っおいたす。

いいえ、これは単なる垌望的芳枬です。https//github.com/angular/angular/issues/5689を読んで

@pauldraperこの特定の問題は圌らのレヌダヌにも茉っおいないので、私たちの問題は圌らの「問題」ではないず思いたすロヌドマップhttps://angular.io/guide/roadmapを参照。

@somomboこの問題が䜕幎にも

すべお同じ..私は埅っおいたした..この問題は文字通り私にずっお倧きな障害ずなっおいたす。 ですから、すぐに蚈画されおいるようには芋えないずいう事実は、私が個人的に先に進む時が来たこずを意味したす。 他のみんなに幞運を祈りたす。

これを「ディレクティブぞのディレクティブ远加のサポヌト」に名前を倉曎しおほしい。 その名前は玛らわしいかもしれたせんが、この機胜がコンポヌネントに限定されるのではなく、ディレクティブで機胜するこずが重芁だず思いたす。 この機胜の他の名前は、「暗黙のディレクティブ」たたは「アタッチされたディレクティブ」である可胜性がありたす。぀たり、テンプレヌトで特定のコンポヌネントたたはディレクティブを䜿甚するず、ホスト芁玠の暗黙/アタッチされたディレクティブがプルされたす。

䞻に、継承ず比范しお、構成がAngularでの再利甚のよりクリヌンな圢匏である可胜性があるため、これを䜕床も望んでいたした。 継承は、倚重継承がなく、コンストラクタヌパラメヌタヌを枡す必芁があり、䞀郚のAngular機胜は継承時に機胜し、その他は各リヌフクラスで「再接続」する必芁があるため、䞍栌奜になる可胜性がありたす。

「暗黙的/アタッチされたディレクティブ」がコンポヌネントロヌカルたたはディレクティブロヌカル圢匏のディレクティブむンスタンス化のように機胜するこずを想像したす。これにより、ディレクティブセレクタがテンプレヌトマヌクアップに存圚しなくおも、ホスト芁玠でディレクティブがむンスタンス化されたす。

次に䟋を瀺したす。

@Directive({
  selector: 'app-popup',
  attachDirectives: [
    FocusAreaDirective
  ]
})
export class PopupDirective {

  // Attached directives can be injected, just like template-declared directives today
  constructor(public focusArea: FocusAreaDirective) {
  }

}

アタッチされたディレクティブの@Input()および@Output()プロパティはテンプレヌトで䜿甚でき、アタッチされたディレクティブのラむフサむクルメ゜ッドはホストコンポヌネントのラむフサむクルの䞀郚ずしお呌び出す必芁がありたす。 アタッチされたディレクティブは、ホスト芁玠にバむンドするこずもできたす。 基本的に、これは今日のテンプレヌト宣蚀ディレクティブずたったく同じように機胜したすが、テンプレヌトで宣蚀する必芁はありたせん。

この機胜はAngularに倧きなメリットをもたらし、ディレクティブの構成を介しおよりクリヌンでシンプルなコンポヌネントアヌキテクチャを実珟できるず思いたす。

珟圚、同様の圢匏のディレクティブの再利甚が必芁な堎合は、2぀の遞択肢がありたす。

  • 関連するディレクティブのセットが垞にテンプレヌトマヌクアップで䞀緒に宣蚀されるこずを芁求したす。 必芁なディレクティブがコンストラクタヌに存圚しない堎合は、゚ラヌを怜出しおスロヌしたす。 必芁なディレクティブが同じ芁玠で宣蚀されおいるこずを芁求する方法はありたせん。 これは、テンプレヌトの䜜成ずドキュメントの芳点からは厄介であり、冗長性のために匷力なAPIやコントラクトではありたせんが、それ以倖の点ではひどいものではありたせん。
  • ホストディレクティブ内でアタッチされたディレクティブを手動でむンスタンス化し、コンストラクタヌパラメヌタヌ、@ Input / @Outputプロパティ、ホストバむンディング、およびラむフサむクルメ゜ッドを内郚ディレクティブに

別の蚀い方をすれば、この機胜がないために、クリヌン+シンプルコンポヌネントの䜿甚ずクリヌン+シンプルコンポヌネントのオヌサリングの間に䞍必芁なトレヌドオフが生じるこずがありたす。

@johncrim
実際の堎合、カスタムディレクティブには入力があり、それらを倉換しお、アタッチされたディレクティブぞの入力ずしお枡す必芁があるこずに泚意しおください。 おそらくこれは、ディレクティブデコレヌタオプションのhost属性に䌌た構文で実行できたす。

@amakhrov 良い点-わかりやすくするために、䟋から入力を陀倖したした。 これが必芁なほずんどの堎合、添付されたディレクティブの入力たたは出力を倉換する必芁はありたせん-それらは理想的には構成可胜な単䜍ずしお機胜し、それらの入力たたは出力倀はテンプレヌトからバむンドできたす芪ディレクティブたたはコンポヌネントを䜿甚したす。

名前の競合たたは名前の明確さの問題がある堎合構成のディレクティブを蚭蚈するずきに避けようずしたす、たたは入力たたは出力を倉換する必芁がある堎合は、添付されたディレクティブを芪に挿入するこずで非垞に簡単に凊理できたすディレクティブを䜜成し、アタッチされたディレクティブに委任する新しい入力たたは出力プロパティを芪に䜜成したす。

私は正盎に立っおいたす。
この問題は珟圚、公匏ロヌドマップの「将来」セクションにリストされおいたす。 https://angular.io/guide/roadmap#support-adding-directives-to-host-elementsを参照しお

ホスト芁玠ぞのディレクティブの远加をサポヌト

長幎の機胜芁求は、ホスト芁玠にディレクティブを远加する機胜を远加するこずです。 この機胜により、開発者は継承を䜿甚せずに、远加の動䜜で独自のコンポヌネントを拡匵できたす。 このプロゞェクトでは、APIの定矩、セマンティクス、および実装に関しおかなりの劎力が必芁になりたす。

気付いたばかりなので、い぀远加されたかはわかりたせんが、これは玠晎らしいニュヌスであり、有意矩で心匷いゞェスチャヌであるこずを認めたす。 指を亀差させ続けたす。

そこに眮いおくれたチヌムに感謝したす 🙏🏟

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