@Directive
をSelectableDirective
として作成したので、カスタムディレクティブに複数値を渡す方法について少し混乱しています。私はたくさん検索しましたが、AngularでTypeScript。
これが私のサンプルコードです。
MCQComponent
としての親コンポーネント:
import { Component, OnInit } from '@angular/core';
import { Question } from '../question/question';
import { AppService } from '../app.service/app.service';
import { SelectableDirective } from '../selectable.directive/selectable.directive';
import { ResultComponent } from '../result-component/result.component';
@Component({
selector: 'mcq-component',
template: "
.....
<div *ngIf = 'isQuestionView'>
<ul>
<li *ngFor = 'let opt of currentQuestion.options'
[selectable] = 'opt'
(selectedOption) = 'onOptionSelection($event)'>
{{opt.option}}
</li>
</ul>
.....
</div>
"
providers: [AppService],
directives: [SelectableDirective, ResultComponent]
})
export class MCQComponent implements OnInit{
private currentIndex:any = 0;
private currentQuestion:Question = new Question();
private questionList:Array<Question> = [];
....
constructor(private appService: AppService){}
....
}
これは、カスタムディレクティブ[selectable]を持つ親コンポーネントです。これはoptという1つのパラメーターを取ります。
このディレクティブのコードは次のとおりです。
import { Directive, HostListener, ElementRef, Input, Output, EventEmitter } from '@angular/core'
import { Question } from '../question/question';
@Directive({
selector: '[selectable]'
})
export class SelectableDirective{
private el: HTMLElement;
@Input('selectable') option:any;
...
}
だからここで親からのより多くのパラメータコンポーネントを渡したいのですが、どうすればこれを達成できますか?
コンポーネントの場合と同様に、テンプレート内で文字列化することにより、必要な数のディレクティブプロパティバインディングを追加できます。
入力プロパティを
HighlightDirective
というdefaultColor
という名前に追加します。@Input() defaultColor: string;
Markup
<p [myHighlight]="color" defaultColor="Violet"> Highlight me too! </p>
Angularは、
@Input
デコレータで公開したため、defaultColor
バインディングがHighlightDirective
に属していることを知っています。いずれにしても、
@Input
デコレータは、このプロパティがパブリックであり、親コンポーネントによるバインドに利用可能であることをAngularに伝えます。@Input
がない場合、Angularはプロパティへのバインドを拒否します。
あなたの例
多くのパラメータを使用して
@Input()
デコレータを使用してプロパティをDirective
クラスに追加します
@Directive({
selector: '[selectable]'
})
export class SelectableDirective{
private el: HTMLElement;
@Input('selectable') option:any;
@Input('first') f;
@Input('second') s;
...
}
そして、テンプレートでli
要素にバインドされたプロパティを渡します
<li *ngFor = 'let opt of currentQuestion.options'
[selectable] = 'opt'
[first]='YourParameterHere'
[second]='YourParameterHere'
(selectedOption) = 'onOptionSelection($event)'>
{{opt.option}}
</li>
li
要素には、selectable
という名前のディレクティブがあります。 selectable
には、f
という名前のfirst
とs
という名前のsecond
という2つの@Input()
があります。 [first]
および[second]
という名前のli
プロパティにこれら2つを適用しました。ディレクティブは、li
要素でこれらのプロパティを検索し、@Input()
デコレータで設定されます。したがって、selectable
、[first]
、および[second]
は、これらの名前のプロパティを持つli
のすべてのディレクティブにバインドされます。
単一パラメータ付き
@Directive({
selector: '[selectable]'
})
export class SelectableDirective{
private el: HTMLElement;
@Input('selectable') option:any;
@Input('params') params;
...
}
Markup
<li *ngFor = 'let opt of currentQuestion.options'
[selectable] = 'opt'
[params]='{firstParam: 1, seconParam: 2, thirdParam: 3}'
(selectedOption) = 'onOptionSelection($event)'>
{{opt.option}}
</li>
多くのオプションを渡すには、オブジェクトを1行のカスタムデータで@Inputデコレータに渡すことができます。
テンプレート内
<li *ngFor = 'let opt of currentQuestion.options'
[selectable] = 'opt'
[myOptions] ="{first: opt.val1, second: opt.val2}" // these are your multiple parameters
(selectedOption) = 'onOptionSelection($event)' >
{{opt.option}}
</li>
指令クラスで
@Directive({
selector: '[selectable]'
})
export class SelectableDirective{
private el: HTMLElement;
@Input('selectable') option:any;
@Input('myOptions') data;
//do something with data.first
...
// do something with data.second
}
別の適切なオプションは、属性としてではなく要素としてDirective
を使用することです。
@Directive({
selector: 'app-directive'
})
export class InformativeDirective implements AfterViewInit {
@Input()
public first: string;
@Input()
public second: string;
ngAfterViewInit(): void {
console.log(`Values: ${this.first}, ${this.second}`);
}
}
そして、このディレクティブは次のように使用できます。
<app-someKindOfComponent>
<app-directive [first]="'first 1'" [second]="'second 1'">A</app-directive>
<app-directive [first]="'First 2'" [second]="'second 2'">B</app-directive>
<app-directive [first]="'First 3'" [second]="'second 3'">C</app-directive>
</app-someKindOfComponent>`
シンプル、きちんとした、強力。
上記のソリューションと同様に、ディレクティブで@Input()
を使用し、ディレクティブで値の複数の配列を渡すことができました。
selector: '[selectorHere]',
@Input() options: any = {};
Input.html
<input selectorHere [options]="selectorArray" />
TSファイルからの配列
selectorArray= {
align: 'left',
prefix: '$',
thousands: ',',
decimal: '.',
precision: 2
};