Angular 7: не может привязываться к «сообщениям», поскольку это неизвестное свойство «списка сообщений»

#angular

#angular

Вопрос:

Я новичок в angular и пытаюсь создать проект чата для хобби в Angular 7 как часть моего обучения. Я действительно застрял в понимании модулей и компонентов, что привело меня к одной проблеме.

Проблема

У меня есть два компонента message-list и message-item , как показано в здесь руководстве. Я не хочу копировать все оттуда, а заинтересован только в понимании концепции списка сообщений и элемента.

Однако я написал некоторый код ниже, и список сообщений не работает.

модели /message.ts

 export class Message {

    avatar: string;
    content: string;
    timestamp: string;

    constructor( avatar: string, content: string, timestamp: string ){

        this.avatar = avatar;
        this.content = content;
        this.timestamp = timestamp;

    }
}
  

message-list.component.ts

 import { Component, OnInit, Input } from '@angular/core';
import { Message } from '../models/message';

@Component({
  selector: 'app-message-list',
  templateUrl: './message-list.component.html',
  styleUrls: ['./message-list.component.css']
})
export class MessageListComponent implements OnInit {

  @Input('messages')
  private messages : Message[];

  constructor() { }

  ngOnInit() {
  }

}
  

message-list.component.html

 <div class="chatlist">
  <ul class="list-group">
    <message-item *ngFor="let msg of messages" [message]="msg"></message-item>
  </ul>
</div>
  

message-item.component.html

 <li class="list-group-item">
  <img [src]="message.avatar" class="avatar"/>
  <div class="message">
    {{message.content}}
  </div>
  <div class="timeform">
    <i class="fa fa-clock-o" aria-hidden="true"></i> <span class="timestamp">at {{message.timestamp | date : 'dd/MM/yyyy' }}</span>
  </div>
</li>
  

message-item.component.ts

 import { Component, OnInit, Input } from '@angular/core';
import { Message } from '../models/message';

@Component({
  selector: 'app-message-item',
  templateUrl: './message-item.component.html',
  styleUrls: ['./message-item.component.css']
})
export class MessageItemComponent implements OnInit {

  @Input('message')
  private message: Message;

  constructor() { }

  ngOnInit() {
  }

}
  

app.module.ts

 import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { ChatWindowComponent } from './chat-window/chat-window.component';
import { MessageListComponent } from './message-list/message-list.component';
import { MessageItemComponent } from './message-item/message-item.component';

@NgModule({
  declarations: [
    AppComponent,
    ChatWindowComponent,
    MessageListComponent,
    MessageItemComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
  

Но когда я запускаю эту программу в Chrome, я получаю:

введите описание изображения здесь

Что я пробовал

Потратил 2 часа на чтение и только на чтение о том, как использовать модули и компоненты, но я даже не смог написать ни одной строки кода, потому что чувствовал себя настолько сбитым с толку, поэтому я пришел сюда, чтобы спросить это

Чего я хочу

Я был бы очень рад, если бы на этом этапе я мог настроить свое приложение для чата для отображения сообщений в этом стиле, как это описано в руководстве ссылка выше:

введите описание изображения здесь

Я был бы рад, если кто-нибудь сможет указать мне правильное направление 🙂 спасибо.

Приветствия!

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

1. Попробуйте сделать свойство общедоступным: @Input() public messages : Message[]; .

2. Сделайте сообщения общедоступными, это должно помочь.

3. я сделал это общедоступным, все то же самое :/

4. Проверьте это приложение на stackblitz: stackblitz.com/edit/angular-ji7cmq

5. @Sebastian: вау. на самом деле я хотел реализовать что-то подобное, но решил сделать это завтра. спасибо за совет. я буду рассматривать вашу ссылку как свою ссылку.

Ответ №1:

Не удается выполнить привязку к ‘messages’, поскольку это неизвестное свойство ‘message-list’

Но у компонента есть селектор <app-message-list> здесь:

 @Component({
  selector: 'app-message-list',
  ...
  

В руководстве все эти селекторы для компонентов не имеют app префиксов, но, когда компоненты были сгенерированы с помощью ng cli , к селекторам были добавлены префиксы по умолчанию ( app ). Попробуйте изменить его в своем шаблоне на:

 <app-message-list>
  

Или измените здесь в метаданных для компонента:

 @Component({
  selector: 'message-list',
  ...
  

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

1. я обновил вопрос. не могли бы вы просто бегло взглянуть. добавлены некоторые недостающие коды

2. глупый я! да, вы правы. я использовал message-list вместо app-message-list . У меня был еще один компонент, где я должен был использовать список сообщений, и он отвечал за отображение его на главной странице. о боже!

Ответ №2:

@Input() private messages: Message[]; Должно быть public , а не private для доступа извне из вашего MessageListComponent .

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

1. Используете ли вы свой компонент таким образом: <app-message-list [messages]="messages"></app-message-list> ?

2. извините. я забыл добавить message-item коды компонентов. пожалуйста, посмотрите недостающие разделы, которые я только что обновил