Помилка, якщо не перевірити, чи існує {{object.field}}


74

У мене питання про перевірку, чи існує якесь поле в об’єкті.

Я хочу надрукувати всі категорії, які є у користувача, тому я роблю щось подібне:

  <ul *ngIf="user.categories.length >  0" *ngFor="#category of user.categories">
    <li>
      {{category.name}}
    </li>
  </ul>

Причина? Усі дані ПРАВИЛЬНО надруковані, але я отримую помилку у веб-консолі, як це:

Cannot read property 'name' of null

Але коли я роблю щось на зразок:

  <ul *ngIf="user.categories.length >  0" *ngFor="#category of user.categories">
    <li *ngIf="category">
      {{category.name}}
    </li>
  </ul>

Тоді все гаразд.

Я роблю щось не так, чи, можливо, мені доводиться перевіряти це кожен раз? Ви коли-небудь мали подібну проблему?

Відповіді:


212

основне використання

Використовуйте оператор безпечної навігації

{{category?.name}}

тоді nameчитається лише тоді, коли categoryні null.

масив

Це працює лише для .оператора (dereference). Для масиву ви можете використовувати

{{records && records[0]}}

Див. Також Angular 2 - Не вдається прочитати властивість '0' невизначеної помилки з контекстом КОНТЕКСТ ПОМИЛКИ: [об'єктний об'єкт]

асинхронний канал

З asyncтрубою його можна використовувати як

{{(chapters | async)?.length

ngModel

В ngModelданий час це потрібно розділити на

[ngModel]="details?.firstname" (ngModelChange)="details.firstname = $event"

Див. Також Дані не додаються до шаблону в angular2

*ngIf

Альтернативою є завжди обгортання частини подання, *ngIf="data"щоб запобігти отриманню частини взагалі до того, як вона dataстане доступною, щоб запобігти помилці відмінювання.


Так, не працює для ngModelприв'язок. Все ще відсутні автоматичні властивості Angular1, які були надзвичайно зручні для CRUD-операцій клієнт-сервер.
RoninCoder

@Hani Я не знаю Angular1. Чи можете ви вказати мені деяку інформацію про властивості, що автоматично генеруються?
Günter Zöchbauer

<input type="text" ng-model="category.name" />а ім'я, яке є нульовим, автоматично генерує властивість name, як тільки користувач вводить текст у текстове поле. Не кажучи вже про те, що оператор elvis не працює [(ngModel)]. Було б непогано, щоб там теж було.
RoninCoder

Нещодавно вони обговорювали, щоб зробити поведінку оператора elvis типовою. Ймовірно, вони зроблять щось поліпшення. Можливо, ще не рано.
Günter Zöchbauer

3
Я шукав цю відповідь, але важко знайти angular2-4 відповіді. Дякую, це так просто і працює добре!
Мікель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.