Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Передача данных из компонента в html (https://javascript.ru/forum/angular/83229-peredacha-dannykh-iz-komponenta-v-html.html)

_marisha 19.10.2021 12:22

Передача данных из компонента в html
 
Начинаю изучать Angular.
Возникла проблема при передачи данных из компонента в html.
Пример:
1) есть компонент post (файлы post.component.html, post.component.scss, post.component.ts)
2) в app.component.ts с помощью интерфейсов создаю Posthttp://joxi.ru/Dr8anVEFJll7Pm
3) в app.component.html обхожу Post c помощью *ngFor http://joxi.ru/4AkLOjei0ee30r
4) в post.component.ts прописываю переменную, с которой буду работать http://joxi.ru/VrwyQZlIjddxl2
5) в post.component.html пытаюсь вывести данные http://joxi.ru/Grqle5gCRKKgBA, но возникает ошибка http://joxi.ru/a2XlevQClLLqB2
Подскажите, что делаю не так и по какой причине title undefined?

_marisha 19.10.2021 13:11

Если в post.component.ts вместо
@Input() post: Post

указать
@Input() post: any
, тогда всё работает

Aetae 19.10.2021 13:50

Ну смотри, когда ты делаешь так:
@Input() post: Post
ты говоришь - вот свойство post, в нём лежит объект типа Post. Но сам объект ты туда явным образом не кладёщь. TS говорит тебе: "эээ нет, раз ты заявляешь что тут Post - будь добр положи".

Когда ты делаешь так:
@Input() post: Post | undefined
Ты говоришь что тут будет Post или ничего. Соответственно когда потом ты используешь post без проверки что он точно есть, TS тебе говорит "possibly undefined" - "возможно, что там нифига нет", т.е. если там ничего нет, а ты пытаешься получить свойства объекта post - это явная ошибка.

Когда ты делаешь так:
@Input() post: any
Ты говоришь: "тут лежит ВСЁ что угодно, при том одновременно, иди ты нафиг TS". Так, конечно, работает - внешне, но это убивает весь смысл TS т.к. никак не защищает от настоящих ошибок.

Теперь к решению: ты можешь написать так:
@Input() post!: Post
Чем ты скажешь TS'у: "тут лежит Post и он там точно есть, мамой клянусь!". Если вдруг его там не окажется - это уже будет забота не TS'а.

Правильным же решением будет просто проверять наличие post перед применением, но как оно там в ангулярах я хз.)

_marisha 20.10.2021 06:35

Aetae, спасибо что откликнулись.
Очень доходчиво расписали возможные варианты, спасибо.
Способ с @Input() post!: Post работает :thanks:
Теперь, во время применения обязательно буду вспоминать ваши примеры :)
Еще подсказали вариант с дефолтными значениями @Input() post: Post = { title: '', text: '', id: 0 }


Часовой пояс GMT +3, время: 22:37.