如何使用 TypeScript 将多个参数传递给 Angular 中的 @Directives (@Components)?
How to pass multiple parameter to @Directives (@Components) in Angular with TypeScript?
自从我将 @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 的参数。
这是该指令的代码:
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;
...
}
所以这里我想从父组件传递更多参数,我该如何实现?
As with components, you can add as many directive property bindings as
you need by stringing them along in the template.
Add an input property to HighlightDirective
called defaultColor
:
@Input() defaultColor: string;
标记
<p [myHighlight]="color" defaultColor="violet">
Highlight me too!
</p>
Angular knows that the defaultColor
binding belongs to the HighlightDirective
because you made it public with the @Input
decorator.
Either way, the @Input
decorator tells Angular that this property is
public and available for binding by a parent component. Without
@Input
, Angular refuses to bind to the property.
以你的例子为例
有很多参数
使用 @Input()
装饰器
将属性添加到 Directive
class
@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()
,f
的名称为 first
和 s
的名称为 second
。我们已将这两个应用于名称为 [first]
和 [second]
的 li
属性。我们的指令将在那个 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>
要传递许多选项,您可以在一行中将对象传递给带有自定义数据的@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>
所以指令 class
@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
};
自从我将 @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 的参数。
这是该指令的代码:
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;
...
}
所以这里我想从父组件传递更多参数,我该如何实现?
As with components, you can add as many directive property bindings as you need by stringing them along in the template.
Add an input property to
HighlightDirective
calleddefaultColor
:@Input() defaultColor: string;
标记
<p [myHighlight]="color" defaultColor="violet"> Highlight me too! </p>
Angular knows that the
defaultColor
binding belongs to theHighlightDirective
because you made it public with the@Input
decorator.Either way, the
@Input
decorator tells Angular that this property is public and available for binding by a parent component. Without@Input
, Angular refuses to bind to the property.
以你的例子为例
有很多参数
使用 @Input()
装饰器
Directive
class
@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()
,f
的名称为 first
和 s
的名称为 second
。我们已将这两个应用于名称为 [first]
和 [second]
的 li
属性。我们的指令将在那个 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>
要传递许多选项,您可以在一行中将对象传递给带有自定义数据的@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>
所以指令 class
@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
};