gpt4 book ai didi

javascript - Angular 2 - 自定义表单控件 - 禁用

转载 作者:太空狗 更新时间:2023-10-29 16:56:03 25 4
gpt4 key购买 nike

我使用由 input[type=text] 和 datepicker 组成的 ControlValueAccessor 创建了一个自定义控件。

当我在模板驱动的表单中使用它时,一切正常。但是当我使用模型驱动方法(响应式(Reactive)表单)时,表单控件上的 disable() 方法似乎没有任何效果。

是否可以像我对模型驱动表单中的所有其他表单控件一样以编程方式禁用/启用我的自定义控件

编辑

我应该注意,我使用的是 Angular v2.1.0,我的方法与 this 几乎相同。因为我一直将其用作指南。

编辑

这是我的自定义控件:

@Component({
selector: 'extended-datepicker',
templateUrl: './extended-datepicker.component.html',
styleUrls: ['./extended-datepicker.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => ExtendedDatepickerComponent),
multi: true
}
]
})
export class ExtendedDatepickerComponent implements OnInit, ControlValueAccessor {
isDatepickerActive: boolean = false;
_selectedDate: Date;
selectedDateString: string = "";
@Input() disabled: boolean;
@Input() mask: any;
@Input() required: boolean;

@ViewChild('textInput') textInput: ElementRef;

get selectedDate(): Date {
return this._selectedDate;
}

set selectedDate(value: Date) {
this.selectedDateString = moment(value).format(STANDARD_DATE_FORMAT);
this._selectedDate = value;
}

propagateChange: Function;

@ViewChild(DatePickerComponent) datepicker: DatePickerComponent;

constructor() {
}

writeValue(value: Date) {
if (value) {
this.selectedDate = value;
this.selectedDateString = moment(value).format(STANDARD_DATE_FORMAT);
}
}

registerOnTouched(): void {
}

registerOnChange(fn: Function) {
this.propagateChange = fn;
}
// ...

这是控件的模板:

<div class="calendar-wrapper row-small-margin" 
(clickOutside)="isDatepickerActive = false;">

<div class="col-xs-10 col-small-padding">
<div class="input-group">

<span class="input-group-addon" role="button" (click)="prevDay()"
*ngIf="selectedDate">
<i class="fa fa-chevron-left"></i>
</span>

<input #textInput [textMask]="{mask: mask}"
[(ngModel)]="selectedDateString"
(ngModelChange)="inputChange()"
class="form-control" [required]="required"
[disabled]="disabled" (keyup)="onKeyPressed($event)">

<span class="input-group-addon" role="button" (click)="nextDay()"
*ngIf="selectedDate">
<i class="fa fa-chevron-right"></i>
</span>
</div>

<div *ngIf="isDatepickerActive" class="datepicker-wrapper">
<datepicker [(ngModel)]="selectedDate" (ngModelChange)="dateChange()"
[showWeeks]="false" [required]="required"
[formatDay]="dd" [formatMonth]="MM" [formatYear]="yyyy"
[disabled]="disabled">
</datepicker>
</div>
</div>

<div class="col-xs-2 col-small-padding">
<button class="btn btn-sm btn-datepicker" [disabled]="disabled"
(click)="toggleDatePicker()" type="button">
<img src="/assets/img/image.png">
</button>
</div>

</div>

这就是我在表单组件中所做的:

this.myForm.controls['pickDate'].valueChanges.subscribe(val => {
if (!val) {
this.myForm.controls['date'].disable(); // This line here does nothing
}
});

如何在我的扩展日期选择器中响应 disable() 调用并采取相应行动?

最佳答案

您的组件需要实现在 ControlValueAccessor 接口(interface)中定义的 setDisabledState 函数(参见 docs )。

例如(假设渲染器已经注入(inject)到构造函数中):

setDisabledState(isDisabled: boolean) {
this.renderer.setElementProperty(this.textInput.nativeElement, 'disabled', isDisabled);
// disable other components here
}

关于javascript - Angular 2 - 自定义表单控件 - 禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40163367/

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