【问题标题】:Angular 4 - make component more reusableAngular 4 - 使组件更可重用
【发布时间】:2019-04-29 01:44:09
【问题描述】:

我想让我的组件更可重用。在组件中,我将两个值与 ngModel 绑定:elem.key 和 elem.value。问题是,无论我想在哪里使用这个组件,元素都必须具有键和值属性,例如来自 Api 的一些数据可能有名称和昵称等。现在我可以重复使用我的组件,但前提是值对象是键和值。我的代码:

html:

<button (click)="addNew()">Add</button>
        <div *ngFor="let elem of elements">
          <text-input [(ngModel)]="elem.key" type="text"></text-input>
          <text-input [(ngModel)]="elem.value" type="text"></text-input>
        </div>

ts:

@Input() elements: any[];

  addNew() {
    this.elements.push({
      key: '',
      value: ''
      });
    }

如果我在另一个组件中使用我的组件:

        <input-key-value [elements]="values">

如果我只需要添加到值数组 {key: '', value: ''} 它工作正常但有时我想添加例如 {name: '', 昵称: ''},导致数据在这个格式必须发送到服务器。

我尝试添加另一个 Input name 输入,{key: 'name', value: 'name'} 并在 html 中:

      <text-input [(ngModel)]="elem[inputs.key]" type="text"></text-input>
      <text-input [(ngModel)]="elem.[inputs.value]" type="text"></text-input>

但这再次将错误的数据推送到我的主数组。

【问题讨论】:

  • “但这又将错误的数据推送到我的主数组”是什么意思?
  • 并尝试拥有您的组件
  • 例如:我想推送到数组:{name:'',昵称:''},但是我的输入键值组件中的函数总是推送 {key:'',值: ''}。但我想将不同的关键元素推送到我的对象,一次键:'',另一个名称:''等。
  • 在下面查看我的答案
  • 我已经更新了我的答案,现在检查一下。我也提到了视图和组件

标签: javascript angular


【解决方案1】:

这对我有用。

输入键值模板:

<div *ngFor="let elem of elements">
  <div *ngFor="let prop of keys(elem)" >
    <text-input type="text" [(ngModel)]="elem[prop]"></text-input>
  </div>
</div>

输入-键-值 ts:

keys(element) {
    return Object.keys(element);
}

根据您的对象有多少属性,它会呈现尽可能多的文本框。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    在您的添加新功能中,您可能需要执行以下操作

    @Input() elements: any[];
    @Input() elementKey: string = 'key';
    @Input() elementValue: string = 'value';
    addNewe() {
        const element = {};
        element[this.elementKey] = '';
        element[this.elementValue] = '';
        this.elements.push(element);
    }
    

    在你看来,你应该像下面那样做

    <button (click)="addNew()">Add</button>
    <div *ngFor="let elem of elements">
        <text-input [(ngModel)]="elem[elementKey]"
            type="text"></text-input>
        <text-input [(ngModel)]="elem[elementValue]"
            type="text"></text-input>
    </div>
    

    当你使用这个组件时,你可能需要传递元素键和元素值

    当您使用您的组件时。如果您必须传递如下所示的键和值,请根据您在评论中提供的示例 {name: '',nickname: ''}

    <input-key-value [elements]="values" [elementKey]='name' [elementValue]='nickname'>
    

    如果您要传递像 {key: '', value: ''} 这样的元素,则不需要传递元素键和元素值输入。你可以直接使用它

    <input-key-value [elements]="values">
    

    【讨论】:

    • 我认为这不符合 OP 的要求。
    • @LloydFrancis 我之前没有提到完整的代码,我已经更新了我的答案,现在你可以看到,我们可以拥有具有自定义属性的动态对象
    • 我仍然认为我们可以让它更通用,而不是硬编码'name'和'nickname',这样可以更好地重复使用。
    • 嗯,是的,我同意你的观点,但现在这将达到他的目的,他可以传递他想要的每一个键和值:)
    • 是的,同意。如果他不提前知道elements 数组将包含什么,这只会是个问题。
    猜你喜欢
    • 2017-10-19
    • 2017-12-02
    • 2018-05-03
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多