gpt4 book ai didi

javascript - Angular:如何获取默认的@Input 值?

转载 作者:行者123 更新时间:2023-12-03 12:54:03 39 4
gpt4 key购买 nike

我们正在开发组件,在使用它们时,我们希望使用与 DOM 节点相同的机制来有条件地定义属性。因此,为了防止属性出现,我们将值设置为 null 并且它在最终的 HTML 输出中不存在。伟大的!

<button [attr.disabled]="condition ? true : null"></button>

现在,当使用我们自己的组件时,这是行不通的。当我们设置 null , 我们实际上得到 null在组件中 @Input 作为值。任何默认设置值都将被覆盖。
...
@Component({
selector: 'myElement',
templateUrl: './my-element.component.html'
})

export class MyElementComponent {
@Input() type: string = 'default';
...
<myElment [type]="condition ? 'something' : null"></myElement>

所以,每当我们阅读 type在组件中,我们得到 null而不是 'default'设置的值。

我试图找到一种方法来获取原始默认值,但没有找到。它存在于 ngBaseDefconstructor 中访问时时间,但这在生产中不起作用。我期待 ngOnChanges在完成的第一次更改中给我真正的(默认)值,因此能够防止 null已设置,但 previousValueundefined .

我们想出了一些方法来解决这个问题:
  • 定义 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; }

    但很好奇,是否还有其他人有类似的问题以及它是如何解决的。我也很欣赏任何其他可能更优雅的想法。

    谢谢!

    最佳答案

    没有标准的 Angular 方式,因为很多时候你会想要 nullundefined作为值(value)。你的想法不是坏的解决方案。我还有几个

  • 我想你也可以使用 ngOnChanges钩子(Hook):
  • @Input()
    type: string = 'defaultType';

    ngOnChanges(changes: SimpleChanges): void {
    // == null to also match undefined
    if (this.type == null) {
    this.type = 'defaultType';
    }
    }
  • 或使用 Observables :
  • private readonly _type$ = new BehaviorSubject('defaultType');

    readonly type$ = this._type$.pipe(
    map((type) => type == null ? 'defaultType' : type)
    );

    @Input()
    set type(type: string) {
    this._type$.next(type);
    }
  • 或创建自己的装饰器 playground
  • function Default(value: any) {
    return function(target: any, key: string | symbol) {
    const valueAccessor = '__' + key.toString() + '__';

    Object.defineProperty(target, key, {
    get: function () {
    return this[valueAccessor] != null ? this[valueAccessor] : value
    },
    set: function (next) {
    if (!Object.prototype.hasOwnProperty.call(this, valueAccessor)) {
    Object.defineProperty(this, valueAccessor, {
    writable: true,
    enumerable: false
    });
    }

    this[valueAccessor] = next;
    },
    enumerable: true
    });
    };
    }

    您可以像这样使用它:
    @Input()
    @Default('defaultType')
    type!: string;

    关于javascript - Angular:如何获取默认的@Input 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58696004/

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