Pu sh в массиве при прослушивании события - PullRequest
0 голосов
/ 08 мая 2020

Я работаю с Ioni c и хочу создать sh массив объекта при возникновении события.

У меня это

    export  class PublicationService {

    constructor(
        private storage: Storage
    ){}

    private addPublicationSubject = new BehaviorSubject<PublicationModel>(new PublicationModel());
    data = this.addPublicationSubject.asObservable();

    publishData(data: PublicationModel) {
        this.addPublicationSubject.next(data);
    }
   }

Здесь , генерируется событие

    savePublication() {
    this.newPublication.id_pub = 1;
    this.newPublication.textPub = this.f.text.value;
    this.newPublication.user_sender = 'Juance';
    this.newPublication.datetime = "asd";
    this.pubService.publishData(this.newPublication);
  }

И на моей домашней странице событие слушает (в ngOnInit)

// Variable defined in the component
publications: PublicationModel[] = [];

//ngOnInit
this.pubService.data.subscribe((data) => {
      if (data != null) {
        console.log(data);

        this.publications.push(data);
      }
});

Теперь моя проблема: когда я пытаюсь получить sh данные в массив, он сообщает мне, что не может прочитать свойство null (this.publications).

При вводе подписки на событие он не принимает переменную, как определено в компоненте. Есть идеи?

enter image description here

РЕДАКТИРОВАТЬ:

Моя домашняя страница компонента

    @Component({
  selector: 'app-home',
  templateUrl: 'home.page.html',
  styleUrls: ['home.page.scss']
})
export class HomePage implements OnInit {

  viewAddPublication: boolean;
  publications: PublicationModel[] = [];
  countLikePub:   number;
  addPublication: any;

  constructor(
    private storage: Storage,
    private navCtrl: NavController,
    private pubService: PublicationService) {
      this.publications = new Array<PublicationModel>();
  }

  ngOnInit() {
    this.publications = [];

    this.pubService.data.subscribe((data) => {
      if (data != null) {
        console.log(data);

        this.setData(data);
      }
    }
    );
    this.viewAddPublication = false;
    this.countLikePub = 0;

    this.storage.get('publications').then((val) => {
      this.publications = val;
    });

  }

  setData(data) {
    this.publications.push(data);
  }

  goToAddPub() {
    this.navCtrl.navigateForward('/add-publication', {
      animated: true,
      animationDirection: "forward",

    });
  }

  public likedPost(event) {
    console.log();
    let like = (document.getElementById(event.target.id) as HTMLElement);
    like.style.color = '#0277bd';
    this.countLikePub++;
  }

режим отладки в chrome

enter image description here

Мне нужен способ pu sh массива в реальном времени, и это единственный способ, который я мог придумать, другой - используйте Socket.io

1 Ответ

1 голос
/ 08 мая 2020

Я думаю, что, возможно, вы устанавливаете публикации на null из-за этой функции:

this.storage.get('publications').then((val) => {
  this.publications = val;
});

Вы можете немного изменить это, чтобы убедиться, что публикации по-прежнему являются массивом

this.storage.get('publications').then((val) => {
   this.publications = val || [];
});

Я добавил this.publications = val || [];, который создает пустой массив, если val не определен

...