【发布时间】:2020-12-04 20:34:12
【问题描述】:
我们正在开发组件,在使用它们时,我们希望使用与 DOM 节点相同的机制来有条件地定义属性。因此,为了防止属性出现,我们将值设置为 null 并且它在最终的 HTML 输出中不存在。太好了!
<button [attr.disabled]="condition ? true : null"></button>
现在,当使用我们自己的组件时,这不起作用。当我们设置null 时,我们实际上在组件@Input 中得到null 作为值。任何默认设置值都将被覆盖。
...
@Component({
selector: 'myElement',
templateUrl: './my-element.component.html'
})
export class MyElementComponent {
@Input() type: string = 'default';
...
<myElment [type]="condition ? 'something' : null"></myElement>
因此,每当我们在组件中读取type 时,我们都会得到null 而不是设置的'default' 值。
我试图找到一种方法来获取原始默认值,但没有找到。当在constructor 时间访问时,它存在于ngBaseDef 中,但这在生产中不起作用。我希望ngOnChanges 在完成的第一次更改中给我真正的(默认)值,因此能够防止设置null,但previousValue 是undefined。
我们想出了一些方法来解决这个问题:
- 定义
default对象并为每个输入设置默认值,当其null - 再次寻址模板中的 DOM 元素,而不是设置 null
<myElement #myelem [type]="condition ? 'something' : myelem.type"></myElement>
- 为每个输入定义 set/get 以防止 null 设置
_type: string = 'default';
@Input()
set type(v: string) {if (v !== null) this._type = v;}
get type() { return this._type; }
但很好奇,是否有其他人有类似的问题以及它是如何解决的。我也很欣赏任何其他可能更优雅的想法。
谢谢!
【问题讨论】:
标签: javascript angular