Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.10.2021, 12:22
Профессор
Отправить личное сообщение для _marisha Посмотреть профиль Найти все сообщения от _marisha
 
Регистрация: 18.05.2018
Сообщений: 170

Передача данных из компонента в 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?
Ответить с цитированием
  #2 (permalink)  
Старый 19.10.2021, 13:11
Профессор
Отправить личное сообщение для _marisha Посмотреть профиль Найти все сообщения от _marisha
 
Регистрация: 18.05.2018
Сообщений: 170

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

указать
@Input() post: any
, тогда всё работает
Ответить с цитированием
  #3 (permalink)  
Старый 19.10.2021, 13:50
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,489

Ну смотри, когда ты делаешь так:
@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 перед применением, но как оно там в ангулярах я хз.)
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 20.10.2021, 06:35
Профессор
Отправить личное сообщение для _marisha Посмотреть профиль Найти все сообщения от _marisha
 
Регистрация: 18.05.2018
Сообщений: 170

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимальная передача данных Aido Node.JS 1 02.05.2020 04:13
Экспорт данных из html файла, тега без type="module" в js. dozmeratus Общие вопросы Javascript 0 01.02.2020 22:46
FancyBox или передача данных greatilya Общие вопросы Javascript 12 28.01.2014 23:38
Передача данных между страницами bea Events/DOM/Window 1 02.02.2012 17:15
Передача данных в IFRAME (по аналогии TinyMCE) PashaTurok Events/DOM/Window 12 01.01.2011 21:55