Подтвердить что ты не робот

Как передать несколько параметров в @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;

    ...
}

Итак, здесь я хочу передать дополнительные параметры из родительского компонента, как это сделать?

4b9b3361

Ответ 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
}