Как получить длину родительского массива в компоненте? AngularJS

#javascript #angularjs #angular

Вопрос:

Если у меня есть свойство в родительском элементе и я хочу получить доступ к этому значению в компоненте, как я смогу это сделать?

Родитель:

 export class Animal{
  animalID ?: Array<number>;
{
 

Ребенок:

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

import {Animal} from '../animal';

@Component({
  selector: 'app-animal',
  templateUrl: './animal.component.html',
  styleUrls: ['./animal.component.css']
})
export class AnimalComponent {
  @Input() animal: Animal;
  public totalAnimals = animal.animalID.length;
  constructor() {
  }
}
 

HTML:

 <mat-card class="animal">
  <mat-card-header>
    <mat-card-title>{{animal.animalID}}</mat-card-title>
    <mat-card-subtitle>Total Animals: {{totalAnimals}}</mat-card-subtitle>
  </mat-card-header>
  <mat-card-content>
  </mat-card-content>
</mat-card>
 

Однако он не может получить доступ к этому массиву numberAnimals, чтобы получить длину. Если бы кто-нибудь мог мне помочь, я был бы очень признателен!

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

1. Что именно это numberAnimals такое ?

2. извините, что я хотел написать там AnimalID, теперь это исправлено.

3. Пожалуйста, создайте скрипку или стекблитц, чтобы продемонстрировать вашу проблему

4. можете ли вы показать html-код?

5. Я вставил его в stackblitz, я использую его в первый раз, так что мне жаль, если он не идеален.

Ответ №1:

Есть некоторые случаи, когда нам нужно уловить изменения ввода в дочернем компоненте, поэтому Angular предоставляет крюк жизненного цикла ngOnChanges.

Пожалуйста, удалите это начальное значение присвоения

 public totalAnimals: number = 0;
 

Добавьте ngOnChanges , чтобы определить, когда ваши входные данные изменятся

   ngOnChanges(changes: SimpleChanges) {
    if (changes.animal) {
      console.log(changes.animal.currentValue);
      // you can check object value and make appr. changes here
      this.totalAnimals = changes.animal.currentValue?.animalID.length;
    }
  }
 

Также добавьте значение в ngOnInit (), чтобы убедиться, что вы получите первое значение

 ngOnInit() {
  this.totalAnimals = animal?.animalID?.length;
}
 

Вы можете узнать больше о вводе здесь: обнаружение-ввод-изменение свойств

Ответ №2:

Потому что свойство «животное» используется до его инициализации. Вы должны установить значение в OnInit(). Если «животное» вызывается из API запроса, в это время инициализируется дочерний компонент, «животное» не определено, вы должны проверить это в крючке жизненного цикла ngOnChanges или проверить, что животное не пустое, чтобы показать дочерний компонент

 export class AnimalComponent implements OnInit {
 @Input() animal: Animal;
 public totalAnimals: number = 0;

 constructor() {}

 ngOnInit(): void {
  this.totalAnimals = animal?.animalID.length;
 }
}
 

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

1. Привет, спасибо, что ответили! Тем не менее, это все еще говорит о том, что животное не определено в функции ngOnInit

2. если это так, то вполне вероятно, что он сломан в родительском компоненте. Можете ли вы поделиться кодом родительского компонента (HTML и машинописный текст)