Как передать несколько параметров в @Directives в Angular с помощью TypeScript?
Поскольку я создал @Directive
как SelectableDirective
, я немного смущен, о том, как передать более одного значения в пользовательскую директиву, я много искал, но didn 't получить правильное решение в 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){}
....
}
Это родительский компонент, имеющий настраиваемую директиву как [выбираемый], который принимает один параметр с именем opt, вот код для этой директивы:
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;
...
}
Итак, здесь я хочу передать дополнительные параметры из родительского компонента, как это сделать?
Ответы
Ответ 1
Из Документация
Как и в случае с компонентами, вы можете добавить столько привязок свойств директивы, сколько вам нужно, навязывая их в шаблоне.
Добавьте свойство ввода в HighlightDirective
, называемое defaultColor
:
@Input() defaultColor: string;
Разметка
<p [myHighlight]="color" defaultColor="violet">
Highlight me too!
</p>
Angular знает, что привязка defaultColor
принадлежит HighlightDirective
, потому что вы сделали ее общедоступной с помощью @Input
декоратор.
В любом случае декоратор @Input
сообщает Angular, что это свойство общедоступный и доступный для привязки родительским компонентом. Без @Input
, Angular отказывается привязываться к свойству.
Для вашего примера
Со многими параметрами
Добавить свойства в класс Directive
с @Input()
decorator
@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
мы имеем два @Input()
's, f
с именем first
и s
с именем second
. Мы применили эти два свойства li
с именем [first]
и [second]
. И наша директива найдет эти свойства на этом элементе li
, которые установлены для него с помощью декоратора @Input()
. Таким образом, selectable
, [first]
и [second]
будут связаны с каждой директивой на li
, которая имеет свойство с этими именами.
С единственным параметром
@Directive({
selector: '[selectable]'
})
export class SelectableDirective{
private el: HTMLElement;
@Input('selectable') option:any;
@Input('params') params;
...
}
Разметка
<li *ngFor = 'let opt of currentQuestion.options'
[selectable] = 'opt'
[params]='{firstParam: 1, seconParam: 2, thirdParam: 3}'
(selectedOption) = 'onOptionSelection($event)'>
{{opt.option}}
</li>
Ответ 2
чтобы передать множество параметров, вы можете передать объект в декоратор @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
}