Интерполяция вложенных объектов Angular 8

Это моя версия Angular CLI:

Angular CLI: 7.3.9
Node: 12.2.0
OS: win32 x64
Angular: 8.0.2

При создании приложения Angular 8 я пытаюсь использовать вложенные группы форм, которые соответствуют следующему объекту:

const Boilerplate: any = {
    1: {
        desc: "section1",
        content: {
            1: "question 1.a:",
            2: "question 1.b:",
            3: "question 1.c"
        }
    },
    2: {
        desc: "section2",
        content: {
            4: "question 2.a:",
            5: "question 2.b:",
            6: "question 2.c",
            7: "question 2.d"
        }
    }
}

Существует внутренняя группа форм FormControls для раздела 1 и раздела 2, а также внешняя группа форм, содержащая две внутренние группы форм. Это определено в файле component.ts.

В component.html я пытаюсь выполнить итерацию через внутреннюю группу форм внешней группы форм и распечатать внутренние элементы управления формами. Это код, который у меня есть до сих пор:

<form [formGroup] = "sectionGroup">
   <div *ngIf = "boilerplate">
       <div *ngFor = "let section of boilerplate | keyvalue">
           {{ boilerplate[section.key].desc }}

           <div formGroupName = "{{section.key}}">
               <div *ngFor = "let question of boilerplate[{{section.key}}]">
                   <-- things -->
               </div>
           </div>
       </div>
   </div>

Строка <div *ngFor = "let question of boilerplate[{{section.key}}]"> завершается с ошибкой:

Unexpected token {, expected identifier, keyword, or string

Я пробовал следующие решения, ни одно из которых не помогло мне:

<div *ngFor = "let question of {{boilerplate}}.{{section.key}}">

<div *ngFor = "let question of {{boilerplate[section.key]}}">

<div *ngFor = "let question of {{boilerplate[{{section.key}}]}}">

<td *ngFor = "let question of Section">{{boilerplate[[section.key]]}}</td>

Я пробовал множество других комбинаций и порядков {} и [] и теперь понимаю, что вложенная интерполяция не поддается разбору.

Есть ли у кого-нибудь предложение о том, как я могу этого добиться? Я использую вложенные группы форм, потому что в будущем у меня могут появиться дополнительные слои секций. Формат объекта Boilerplate можно изменить, если это сделает проблему решаемой (потому что я определил его сам).

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

Следующее было решением, которое решило эту проблему:

<div *ngFor = "let question of boilerplate[section.key].content | keyvalue">
    {{question.value}}
</div>
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
3
0
5 086
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я пытаюсь, как показано ниже,

<div [formGroup] = "formGroup">
<div *ngIf = "boilerplate">
<div *ngFor = "let section of boilerplate | keyvalue">
      {{ boilerplate[section.key].desc }}
  <div>
    <div *ngFor = "let question of boilerplate[section.key].content | keyvalue">
      {{ question | json }}
    </div>
  </div>
</div>

Вывод, как показано ниже,

section1
{ "key": "1", "value": "question 1.a:" }
{ "key": "2", "value": "question 1.b:" }
{ "key": "3", "value": "question 1.c" }
section2
{ "key": "4", "value": "question 2.a:" }
{ "key": "5", "value": "question 2.b:" }
{ "key": "6", "value": "question 2.c" }
{ "key": "7", "value": "question 2.d" }

Это то, что я в итоге сделал, спасибо!

Irina Fortiss 26.06.2019 16:41
Ответ принят как подходящий

Вам нужно использовать канал фильтра ключевое значение, тогда у вас может быть следующий синтаксис, это позволит вам использовать ngFor* для итерации по объектам, а не по массивам.

<div *ngFor = "let question of boilerplate | keyValue">
    {{ question.key }} - {{ question.value }}
</div>

Затем вы можете сделать то же самое для вложенных объектов внутри, пока не отобразятся правильные данные. Это поддерживается не во всех версиях Angular, но определенно нормально в 8.

Если у вас есть объекты с ключом в виде числа, я бы попытался преобразовать его в массив, который поможет вам сделать это немного проще. Позволяет использовать традиционные *ngFor

Вместе с предложением Максима Кузьмина это сработало: <div *ngFor = "let question of boilerplate[section.key].content | keyvalue"> {{question.value}} </div> Спасибо.

Irina Fortiss 26.06.2019 16:34

рад, что вы решили свою проблему, пожалуйста, не стесняйтесь редактировать это в этом ответе

Dince12 26.06.2019 16:35

Ответ от schoolcoder отличный, я просто хотел бы опубликовать еще один пример для людей в будущем с той же проблемой.

У меня есть блок объектов, который содержит список транзакций, и я хочу показать его на своей странице, используя два * ngFor

Класс блочной модели:

export class Block {
  hash: string;
  previousBlockHash: string;
  transactions: Transaction[];  <<<<<<<<<<<
  merkleRoot: string;
  tries: number;
  timestamp: number;
}

Класс модели транзакции

export class Transaction {
  hash: string;
  text: string;
  senderHash: string;
  signature: string;
  timestamp: number;
}

Как я показываю это на своей странице:

Blocks:
<div class = "container">
  <ul class = "list-group">
    <li class = "list-group-item" *ngFor = "let block of blocks | keyvalue">
      Hash: {{blocks[block.key].hash}}<br>
      Previous block hash: {{blocks[block.key].previousBlockHash}}<br>
      Merkle root: {{blocks[block.key].merkleRoot}}<br>
      Tries: {{blocks[block.key].tries}}<br>
      Timestamp: {{blocks[block.key].timestamp}}<br>

      Transactions in this block:
      <ul class = "list-group">
        <li class = "list-group-item" *ngFor = "let transaction of blocks[block.key].transactions">
          {{[block.key]}}<br>
          Hash: {{transaction.hash}}<br>
          Text: {{transaction.text}}<br>
          SenderHash: {{transaction.senderHash}}<br>
          Signature: {{transaction.signature}}<br>
          Timestamp: {{transaction.timestamp}}
        </li>
      </ul>
    </li>
  </ul>
</div>

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