代码之家  ›  专栏  ›  技术社区  ›  Alfa Bravo

angular@input,将对象绑定到同一对象,但属性名不同

  •  1
  • Alfa Bravo  · 技术社区  · 5 年前

    我在文档中看到,您可以按如下方式更改属性名: @Input('account-id') id: string;

    但是,是否有一种方法可以将对象中的属性名更改为不同的名称?

    我有一个可重用的单选按钮组件,它接受一个我想要如下所示的对象:

    export class ICustomRadioButton {
        name: string;
        color: string;
        rank: number;
     }
    
     // ...
    
     @Input('buttons') radioButtons: ICustomRadioButton;
    

    但我希望传递到单选按钮组件中的对象如下所示:

    Sample1: {levelName: 'One', levelColor: #ffffff, levelRank: 2}
    Sample2: {cutomerName: 'Alfa', cutomerColor: #ffffff, cutomerRank: 4}
    
    <app-custom-radio-group [buttons]='customerInfo' (buttonPicked)='buttonPicked($event)'></app-custom-radio-group>
    

    因此,传入的对象将始终具有相同的结构,但名称应更改,以便在组件外部具有自定义属性名称,而在组件内部具有通用属性名称…

    2 回复  |  直到 5 年前
        1
  •  0
  •   Markus Dresch    5 年前

    您必须将传递的模型映射到内部模型。

    首先,您必须使用属性而不是类变量(至少是setter):

    // since this is plural, you probably want an array instead?
    private _buttonsModel: ICustomRadioButton = {};
    
    // we'll use "any" type, since we don't know the property names
    private _radioButtons: any;
    
    get radioButtons(): any {
        return this._radioButtons;
    }
    
    @Input('buttons')
    set radioButtons(value: any) {
        this._radioButtons = value;
    
        // mapping: you got different solutions here, for example Object.keys etc.
        // for-in loops through all properties
        for (const property in value) {
            // now compare the property names to the ones you're looking for
            if (property.endsWith('Name') { this._buttonsModel.name = value[property]; }
            // etc...
        }
    }
    
        2
  •  0
  •   Eliseo    5 年前

    你可以变得更舒适(但等于月)。

    _radioButtons:any={"Name"."",Color:"",Rank:""} //<--define a model
    @Input('buttons')
    set radioButtons(value: any) {
        for (let property in this.model)
        {
          //You can use x.indexOf(property)>=0 or x.endWidth(property)
          let field=Object.keys(value).find(x=>x.indexOf(property)>=0);
          this._radioButtons[property]=field?value[field]:null
        }
    }