Модель связывания для нескольких элементов

У меня есть довольно сложный объект, который должен быть моделью для компонента.

Это может выглядеть примерно так:

{
    "attribute1": "value1",
    "attribute2": "value2",
    "attribute3": "value3",
    "attribute4": "value4",
    "attribute5": "value5",
    "attribute6": "value6",
    "attribute7": "value7",
    "attribute8": "value8"
}

Это может быть сохранено в компоненте в открытом атрибуте с именем "iHaveAVeryLongButReadableName".

Если мне теперь нужно создать вход для каждого атрибута в модели, я должен написать что-то вроде этого:

<input [(ngModel)]="iHaveAVeryLongButReadableName.attribute1" >
<input [(ngModel)]="iHaveAVeryLongButReadableName.attribute2" >
<input [(ngModel)]="iHaveAVeryLongButReadableName.attribute3" >

И поскольку все входы разные, я не могу использовать ngFor. (в реальном мире, а не в этом примере)

Со старым angularJS я мог бы сделать что-то вроде этого:

<div ng-model="iHaveAVeryLongButReadableName">
    <input ng-model="attribute1" >
    <input ng-model="attribute2" >
    <input ng-model="attribute3" >
</div>

Который вам будет НАМНОГО проще и читабельнее.

Есть ли решение для этого избыточного кода?

Я мог бы создать открытые атрибуты в компоненте для сопоставления атрибутов, но все равно избыточный код просто переместился бы из HTML в Typescript.

Есть идеи?

РЕДАКТИРОВАТЬ

Спасибо за ответы!

Извините, но это могло быть неясно, но *ngFor не работает для меня. Каждый вход полностью отличается от другого. Пример, кажется, был простым. Это выглядит примерно так:

<div>

    <input ng-model="iHaveAVeryLongButReadableName.attribute1" type="date" >
    <input ng-model="iHaveAVeryLongButReadableName.attribute2" type="number" >
    <special-input-component ng-model="iHaveAVeryLongButReadableName.attribute3" >
    <div>
        <div>
            some structural information {{iHaveAVeryLongButReadableName.attribute3}}
        </div>
        <input ng-model="iHaveAVeryLongButReadableName.attribute3" />
    </div>
</div>

В этом случае *ngFor не помог бы мне в любом случае. Я мог бы работать с *ngFor и *ngIf, но я думаю, что это будет гораздо сложнее, чем необходимо. "Старый" способ изменения области видимости для элемента дерева DOM в этом случае казался более простым.

2 ответа

Угловой имеет keyvalue труба, с которой вы можете перебирать свойства объекта *ngFor,

Так:

<div *ngFor="let val of iHaveAVeryLongButReadableName | keyvalue">
  <input [(ngModel)]="val.key">
</div>

StackBlitz

Да, вы можете перебирать ключи объекта, имея переменную в компоненте

В компоненте

 objectKeys = Object.keys;
 iHaveAVeryLongButReadableName= {
    "attribute1": "value1",
    "attribute2": "value2",
    "attribute3": "value3",
    "attribute4": "value4",
    "attribute5": "value5",
    "attribute6": "value6",
    "attribute7": "value7",
    "attribute8": "value8"
}

тогда в вашем html просто перебирайте ключи так:

<div *ngFor="let key of objectKeys(iHaveAVeryLongButReadableName)">

Дайте мне знать, если это помогло

Другие вопросы по тегам