【发布时间】:2018-03-06 08:21:33
【问题描述】:
我有基于供应商组件的自定义日期和时间选择器组件。 如果简化它可以看起来像这样:
@Component({
selector: 'app-date-time-picker',
template: `
<vendor-date-picker [(ngModel)]="date"></vendor-date-picker>
<vendor-time-picker [(ngModel)]="time"></vendor-time-picker>
`
})
export class DateTimePickerComponent {
@Output() timestampChanged = new EventEmitter<number>();
date: string;
time: string;
reset() {
this.date = "";
this.time = "";
}
}
我有一个使用 DateTimePicker 的父组件,有时需要重置它的状态:
@Component({
selector: 'app-parent',
template: `
<app-date-time-picker #dateTimePicker (timestampChanged)="updateDateTime($event)"></app-date-time-picker>
`
})
export class Parent {
@ViewChild('dateTimePicker') private _dateTimePicker: DateTimePickerComponent;
someEvent() {
this._dateTimePicker.reset();
}
}
我从供应商那里创建如此丑陋的组件的原因(和相关代码)超出了问题的范围。对我来说重要的是使用 ViewChild 打破了对孩子的封装。而且我无法使用“日期”和“时间”等“私有”关键字保护其他子字段,因为它们在模板中使用。所以问题是角度拥有机制是通过某些声明的公共接口(如使用输入)调用子方法还是保护其他子组件字段在模板中仍然可用但不能从外部访问?
【问题讨论】:
-
我会选择
ViewChild。我不知道你为什么认为它破坏了封装 -
ViewChild 非常适合您的情况。可以使用它,私有字段不会受到影响,如果您有公共字段,则可以从其他类访问它们
-
OOP / SOLID 背景。这就是为什么我认为这根本不行。
-
这不是解释。我也没有看到破绽。
-
@HenkHolterman 我认为 OP 意味着可能存在 TS 目前无法阻止的潜在封装破损。
标签: angular typescript