gpt4 book ai didi

Angular 5/6 : Component Interface - is it possible?

转载 作者:太空狗 更新时间:2023-10-29 17:15:42 27 4
gpt4 key购买 nike

这就是我想要完成的事情:创建一个组件来包裹 MatStepper,它将接受 2..n 个步骤,每个步骤都有自己的组件。

话虽如此,我知道如何用其他语言做到这一点的方法是创建一个具有通用行为的接口(interface),并在不同的组件中实现它,但在包装器组件中使用该接口(interface)。

wizard-step.component.ts

export interface WizardStep {
isValid: boolean;

nextClicked(e);
previousClicked(e);
}

wizard.component.ts

import { Component, Input, OnInit, ViewChild } from '@angular/core';
import { ProgressBarType } from '../progress-bar/ProgressBarType';
import { MatStepper } from '@angular/material';
import { WizardStep } from './wizard-step.component';

@Component({
selector: 'app-wizard',
templateUrl: './wizard.component.html',
styleUrls: [ './wizard.component.css' ]
})
export class WizardComponent implements OnInit {

progress: number;
progressBarType = ProgressBarType.Progress;

@Input() steps: WizardStep[] = [];

/**
* The material stepper instance.
*/
@ViewChild('stepper') private stepper: MatStepper;

constructor() {
}


ngOnInit() {
this.calculateProgress(0);
}

public calculateProgress(index: number): void {
this.progress = ((index + 1) / this.steps.length) * 100;
}

public next(e): void {
this.steps[e.selectedIndex].nextClicked(e);
}

public previous(e): void {
this.steps[e.selectedIndex].previousClicked(e);
}

public selectionChange(e):void {
this.calculateProgress(e.selectedIndex);
}
}

wizard.component.html

<panel>
<progress-bar class="progress-margins" [progress]="progress" [type]="progressBarType"></progress-bar>
<mat-horizontal-stepper class="hide-header" #stepper (selectionChange)="selectionChange($event)">
<mat-step *ngFor="let step of steps">
<ng-container *ngComponentOutlet="step"></ng-container>
</mat-step>
</mat-horizontal-stepper>

<form-buttons
primaryLabel="Next"
(primaryButtonClicked)="stepper.next(); next($event)"
secondaryLabel="Previous"
(secondaryButtonClicked)="stepper.previous(); previous($event)">
</form-buttons>
</panel>

然后我尝试通过创建一个验证组件来使用这个组件,每个向导步骤都有一个组件:

wizard-validation.component.ts

import { Component, OnInit } from '@angular/core';
import { WizardStep } from 'framework';
import { WizardValidationStep1Component } from '../wizard-validation-step1/wizard-validation-step1.component';
import { WizardValidationStep2Component } from '../wizard-validation-step2/wizard-validation-step2.component';
import { WizardValidationStep3Component } from '../wizard-validation-step3/wizard-validation-step3.component';

@Component({
selector: 'app-wizard-validation',
templateUrl: './wizard-validation.component.html',
styleUrls: []
})
export class WizardValidationComponent implements OnInit {

steps: WizardStep[] = [];

constructor() {
}

ngOnInit() {
this.steps.push(WizardValidationStep1Component);
this.steps.push(WizardValidationStep2Component);
this.steps.push(WizardValidationStep3Component);
}

}

wizard-validation.component.html

<wizard [steps]="steps">
</wizard>

最后,WizardValidationStep1ComponentWizardValidationStep2ComponentWizardValidationStep3Component 在这一点上是相同的:

import { Component } from '@angular/core';

import { WizardStep } from 'framework';

@Component({
selector: 'app-wizard-validation-step1',
templateUrl: './wizard-validation-step1.component.html',
styleUrls: []
})
export class WizardValidationStep1Component implements WizardStep {

isValid: boolean;
stepName = 'Step 1';

constructor() {
this.isValid = true;
}

nextClicked(e) {
alert('Clicked next on ' + this.stepName);
}

previousClicked(e) {
alert('Clicked previous on ' + this.stepName);
}
}

使用wizard-validation-step1.component.html:

<p>
wizard-validation-step1 works!
</p>

wizard.component.ts 中,如果我使用无类型数组而不是 WizardStep 数组,它会很好地工作,但当然我的步骤组件不会记录点击等。

@Input() steps = [];

如上所示使用时,当我尝试运行 ng build 时,我收到以下消息:

ERROR in src/app/wizard-validation/wizard-validation.component.ts(20,21): error TS2345: Argument of type 'typeof WizardValidationStep1Component' is not assignable to parameter of type 'WizardStep'.
Property 'isValid' is missing in type 'typeof WizardValidationStep1Component'.
src/app/wizard-validation/wizard-validation.component.ts(21,21): error TS2345: Argument of type 'typeof WizardValidationStep2Component' is not assignable to parameter of type 'WizardStep'.
Property 'isValid' is missing in type 'typeof WizardValidationStep2Component'.
src/app/wizard-validation/wizard-validation.component.ts(22,21): error TS2345: Argument of type 'typeof WizardValidationStep3Component' is not assignable to parameter of type 'WizardStep'.
Property 'isValid' is missing in type 'typeof WizardValidationStep3Component'.

我尝试使用的模式在 Angular 5/6 中有效吗?如果没有,是否有其他方法可以完成我想要做的事情?

最佳答案

为什么不使用图书馆? This one is cool

如果库不是一个选项,我会创建一个自定义步骤指令并将步骤规定切换到 html 模板。

所以,而不是

// wizard.component.ts

ngOnInit() {
this.steps.push(WizardValidationStep1Component);
this.steps.push(WizardValidationStep2Component);
this.steps.push(WizardValidationStep3Component);
}

你会这样做

<!-- something-using-wizard.component.html -->

<my-wizard>
<my-step1-component myStep [someInput]="true"></my-step1-component>
<my-step2-component myStep [someOtherInput]="'foo'"></my-step2-component>
</my-wizard>

并使用 @ContentChildren() 装饰器在 WizardComponent 中获取您的步骤实例

// wizard.component.ts

@ContentChildren(MyStepDirective)
public steps: QueryList<MyStepInterface>;

您可以在我链接的库的源代码中进一步启发自己。作者做了类似的事情...

希望对您有所帮助 :-)

关于 Angular 5/6 : Component Interface - is it possible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50703227/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com