Могу ли я использовать transform
, чтобы @Input или InputSignal получали массив и преобразовывали его в объект, содержащий массив?
Пример:
<my-component
[array] = "myArray"
/>
export class MyComponent {
public readonly array = input<number[]>([], {
transform: transformArrayToObject,
});
Итак, если значение, переданное в массив, равно [1, 2, 3]
, преобразованные данные будут, например:
{
array: [1, 2, 3];
status: Status.OK
}
Трансформация обычно хороша для изменения исходного типа и возврата того же типа с манипуляциями с внутренними значениями. Если вы хотите создать новый объект, лучше использовать computed
, который создаст новый объект на основе исходного сигнала. Вычисленный сигнал будет обновляться при каждом изменении исходного сигнала.
...
export class Child {
public readonly value: InputSignal<any[]> = input<any[]>([]);
public readonly computedValue = computed(() => ({
status: Status.OK,
data: this.value(),
}));
}
import { CommonModule } from '@angular/common';
import { Component, InputSignal, computed, input } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import 'zone.js';
export enum Status {
OK,
}
export interface DataObject {
status: number;
data: any[];
}
@Component({
selector: 'app-child',
imports: [CommonModule],
standalone: true,
template: `{{computedValue() | json}}`,
})
export class Child {
public readonly value: InputSignal<any[]> = input<any[]>([]);
public readonly computedValue = computed(() => ({
status: Status.OK,
data: this.value(),
}));
}
@Component({
selector: 'app-root',
standalone: true,
imports: [Child],
template: `
<app-child [value] = "[1,2,3,4,100]"/>
`,
})
export class App {
name = 'Angular';
}
bootstrapApplication(App);