【问题标题】:angular : unable to set the object using @input getter and setter角度:无法使用@input getter 和 setter 设置对象
【发布时间】:2019-04-12 08:49:29
【问题描述】:

我基本上是在尝试将对象转换为数组并将其绑定到 kendo-dropdown 控件。当我直接进行@Input 绑定时,下拉列表会绑定,但会出现错误,指出不支持 data.map。基本上,下拉列表需要一个数组对象。当我为@Input 使用getter 和setter 属性时,我将fundclass 设置为未定义。谁能告诉我问题是什么

get fundclass(): any {
    return this._fundclass;
}

@Input()
set fundclass(fundclass: any) {
    if (this.fundclass !== undefined ) {
        this._fundclass =  Object.keys(this.fundclass).map(key => ({type: key, value: this.fundclass[key]}));
    }
}

JSON - 为了清楚起见,我在调试期间对对象进行了 JSON.parse,只是为了显示对象的内部结构是什么样的

"[{"FundClassId":13714,"FundClass":"Class D"},{"FundClassId":13717,"FundClass":"Class B"},{"FundClassId":13713,"FundClass":"Class A"},{"FundClassId":13716,"FundClass":"Class B1"},{"FundClassId":13715,"FundClass":"Class C"}]"

HTML

<kendo-dropdownlist style="width:170px" [data]="fundclass" [filterable]="false"
            [(ngModel)]="fundclass" textField="FundClass" [valuePrimitive]="true"
            valueField="FundClassId"  (valueChange)="flashClassChanged($event)"></kendo-dropdownlist>

根据之前的建议更新了代码和 UI。这里的问题是我看不到显示值,我看到的只是基础值,即 id 的值

_fundclass: any;

      get fundclass(): any {
        return this._fundclass;
      }

      @Input()
      set fundclass(fundclass: any) {
        if (fundclass !== undefined ) {
         this._fundclass =  Object.keys(fundclass).map(key => ({text: key, value: fundclass[key]}));
        }
      }

标记

<kendo-dropdownlist style="width:170px" [data]="fundclass" [filterable]="false"
            [(ngModel)]="fundclass" textField="key" [valuePrimitive]="true"
            valueField="fundclass[key]"  (valueChange)="flashClassChanged($event)"></kendo-dropdownlist>

【问题讨论】:

  • 您没有在任何地方使用您在 setter 中收到的 fundclass

标签: angular


【解决方案1】:

您正在使用引用对象属性的this.fundclass,因此请删除该this 部分以获取函数参数。

@Input()
set fundclass(fundclass: any) {
  if (fundclass !== undefined ) {
  //--^^^^^^^^--- here
     this._fundclass =  Object.keys(fundclass).map(key => ({text: key, value: fundclass[key]}));
     // ---------------------------^^^^^^^^^^^---------------------------------^^^^^^^^^^^^^^^----- here
  }
}

您甚至可以使用Object.entries() 方法和Destructuring assignment 来简化您的代码。

@Input()
set fundclass(fundclass: any) {
  if (fundclass !== undefined ) {
     this._fundclass =  Object.entries(fundclass).map(([text, value]) => ({text, value}));
  }
}

更新:问题在于模型绑定您使用相同的模型,而绑定将其更改为其他内容,否则当您更改值时,所选值将设置为_fundclass 属性值但下拉数据应该是一个数组。

模板:

<kendo-dropdownlist style="width:170px" [data]="fundclass" [filterable]="false"
        [(ngModel)]="fundclass1" textField="FundClass" [valuePrimitive]="true"
        valueField="FundClassId"  (valueChange)="flashClassChanged($event)"></kendo-dropdownlist>

TS:

_fundclass:any;
fundclass1:any;

get fundclass(): any {
    return this._fundclass;
}

@Input()
set fundclass(fundclass: any) {
    if (this.fundclass !== undefined ) {
        this._fundclass =  Object.keys(this.fundclass).map(key => ({type: key, value: this.fundclass[key]}));
    }
}

【讨论】:

  • 它现在不是未定义的,但组合框不显示数据。我可以看到 [对象] [对象]。我的标记是否需要更改。我试过 textField="fundclass[key]" 和 valueField="key"
  • @Tom : 试试{text: key, value: fundclass[key]} ...对于文本,您需要设置文本属性而不是类型...。
  • 我试过了。并将我的标记更改为 textField="key" 和 valueField="fundclass[key]"。我看到的是下拉列表中的基础值,而不是显示测试。例如,我在下拉菜单中看到 0,1,2
  • @Tom : 你能分享fundclass的价值吗
  • 更新了 JSON 的外观
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多