Как связать объект с ключами и значениями в Angular?

#c# #angular #typescript

Вопрос:

В машинописном виде я получаю data от ASP.NET Основной C# Dictionary (Это не a Map , но у него есть ключи и значения, т. Е. я могу запускать Object.keys(data) и Object.values(data) ).

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

Грубо:

       <dx-gallery [dataSource]="data">
        <div *dxTemplate="let i of 'item'">
          <dx-chart [dataSource]="i.value">
            <dxi-series [name]="i.key" valueField="value.X"
 

i представляет собой единственную пару ключ-значение (строка и массив) из всей коллекции данных. в C# я бы написал i.Key и i.Value , но для меня это не работает в машинописном формате (компонент не видит отображаемые данные).

Мне нужно связать key и X

данные {A: Массив, B: Массив} , где массив-myObj[]

Комментарии:

1. Не могли бы вы немного прояснить для нас? Каков вывод data . например, если вы свяжете его с dom через <pre>{{data | json}}</pre> . Кроме того, let i of 'item' похоже, что он будет просто повторять символы в строке «элемент». Или, по крайней мере, поделитесь функцией, стоящей за входом *dxTemplate.

2. данные-это набор пар ключ-значение, и я-каждая из пар. это есть в тексте.

3. как это не ТАКОЙ вопрос?

Ответ №1:

Вы могли бы попробовать родной KeyValuePipe из углового: здесь

Это выглядело бы так и позволяло бы вам ссылаться на записи с key и value :

 <dx-gallery [dataSource]="data">
  <div *dxTemplate="let i of item | keyvalue">
     <dx-chart [dataSource]="i.value">
       <dxi-series [name]="i.key" valueField="value.X">
 

Ответ №2:

вы можете зацикливаться на объекте, захватывая его ключи.

напр.

 // component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  name = 'Angular';
  data = {
    prop1: 'a',
    prop2: 'b'
  };
  keys = Object.keys(this.data);
}
 

 //component.html
<p *ngFor="let k of keys">
  {{k}} : {{data[k]}}
</p>
 

Кроме того, вы можете предоставить Object классу доступ к html-шаблону и при необходимости захватить ключи и значения.

напр.

 import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  name = 'Angular';
  data = {
    prop1: 'a',
    prop2: 'b'
  };
  keys = Object.keys(this.data);
  Object = Object;
}
 

 // html
<p *ngFor="let k of Object.keys(data)">
  {{k}} : {{data[k]}}
</p>
 

Однако добавление вызовов функций в ваш html иногда может быть менее эффективным, чем простое сохранение «ключей» var в ts файле, так как функция будет пересматриваться с каждым циклом обнаружения изменений.

Комментарии:

1. Я не могу использовать ngFor, потому dx-gallery что он уже предоставляет ту же функциональность, и у него есть своя цель, от которой я не могу избавиться

2. это слайдер, который отображает несколько элементов один за другим

3. может быть, в документах есть какая-то помощь, Извините, я мало что знаю об этой библиотеке, но удачи, похоже, там может быть какая-то полезная информация. Похоже [dataSource] , требуется вменение массива, а не объекта «Назначить массив параметру источника данных».

4. Я думаю, что в typescript/js просто нет того, что я хочу, и я собираюсь использовать функциональный подход, как вы предложили.

5. похоже, вам может просто понадобиться преобразовать свой объект в массив, прежде чем отправлять его на вход [источник данных].