Ionic2 - Динамическое изменение содержимого ионной карты

У меня есть список книг, которые загружаются в класс через провайдера из внутреннего API. Это образцы данных, которые я получаю

 {
   "success":true,
   "books":[
      {
         "id":1000,
         "book_code":"CC219102",
         "read_status":"completed",
         "name":"Book A",
         "price":"80"
      },
      {
         "id":1001,
         "book_code":"CC219103",
         "read_status":"reading",
         "name":"Book B",
         "price":"50"
      },
      {
         "id":1002,
         "book_code":"CC219104",
         "read_status":"completed",
         "name":"Book C",
         "price":"120"
      },
      {
         "id":1003,
         "book_code":"CC219105",
         "read_status":"yet_to_read",
         "name":"Book D",
         "price":"75"
      },
      {
         "id":1004,
         "book_code":"CC219106",
         "read_status":"completed",
         "name":"Book E",
         "price":"100"
      }
   ]
}

Как видите, в этом случае API возвращает пять книг. Я вызываю функцию loadBooks () внутри контроллера для получения этих данных, и они хранятся в массиве myBooks: any = [];

Я повторяю этот массив и отображаю каждую книгу с помощью ионной карты.

Дело в том, что полученные нами данные могут измениться. И есть еще одна функция refreshBookData (), которая снова извлекает данные, и это было реализовано с использованием сокета. Поэтому, когда есть изменения, я хочу также показать изменения на странице html

Если цена книги изменится, в этой функции будет доступна новая цена, и я хочу обновить информацию о карте для этой книги.

В сети это легко сделать. Не знаю, как этого добиться в ионной среде. Может ли кто-нибудь предложить мне решение?

HTML КОД

  <ion-card *ngFor = "let book of books" id = "{{book.book_code}}">
    <ion-grid>
      <ion-row class = "{{book.read_status}} row">
        <ion-col>
            <span>{{book.name | uppercase}}</span>          
        </ion-col>
        <ion-col>
          <div>
            <div float-right>{{book.price}}</div>
          </div>
        </ion-col>
      </ion-row>
    </ion-grid>
  </ion-card>

А класс компонента выглядит так:

import { Component } from '@angular/core';
import { NavController, NavParams, LoadingController } from 'ionic-angular';
import * as io from "socket.io-client";
import { BookServicesProvider } from './../../providers/book-services/book-services';
import { Storage } from '@ionic/storage';


@Component({
  selector: 'page-my-books-page',
  templateUrl: 'my-books-page.html',
})
export class MyJobsPage {
  memberId: any= 1;
  myBooks: any = [];

  constructor(public navCtrl: NavController, public navParams: NavParams,
    private storage: Storage, private bookService: BookServicesProvider) {
    this.loadBooks(this.memberId);
    this.refreshBookData(this.memberId);
  }

  loadBooks(memberId) {
    let reqParams = {
      memberId: memberId
    };
    this.jobService.myJobs(reqParams)
    .then(data => {
        this.myJobs = data['jobs'];
    });
  }

  refreshBookData(memberId) {
    var params = {
        memberId: memberId.toString()
    };
    var socket = io('localhost:3000/books');
    socket.on('connect', function (obj) {

        //Emitting the params to socket
        socket.emit('bookStatuses', params);

        socket.on('book_statuses', function (data) {
            //received data; storing it in temp variable
            var myBooksTemp = data.books;

            if (myBooksTemp) {
                //iterating through the changed data
                myBooksTemp.forEach((value, key, index) => {


                    //code to change html here


                });
            }
        });
    });
  }
}

Это проблема с обновлением данных?

Sagar Kharche 04.05.2018 12:59

Да, я не знаю, как обновить данные в списке, который уже был повторен. Чтобы идентифицировать каждую карту отдельно, я присвоил каждой карте уникальный идентификатор. Надеюсь, есть способ обновить данные карты, используя этот идентификатор. @ Сагар Харче

Lonewolf 04.05.2018 13:05

Вам нужно сообщить angular об обновлении содержимого? может использовать markForCheck (), попробуйте вызвать markForCheck после назначения данных.

Sagar Kharche 04.05.2018 13:08

Я не совсем знаком с этим. Есть ли другой способ обновить html? @ Сагар Харче

Lonewolf 04.05.2018 13:12
stackoverflow.com/questions/41364386/… Это могло бы вам помочь.
Sagar Kharche 04.05.2018 13:13

Есть ли способ обновить содержимое массива myBooks с помощью функции refreshBookData ()? @ Сагар Харче

Lonewolf 04.05.2018 13:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
205
1

Ответы 1

Публикация в качестве ответа, потому что я не могу комментировать. Но, возможно, это из-за изменения области действия, используйте '=>' вместо 'function'.

socket.on('book_statuses', data => {
            //received data; storing it in temp variable
            var myBooksTemp = data.books;

            if (myBooksTemp) {
               //If I understood right, here is where you get the updated
               //books, so, set in 'myBooks'
               this.myBooks = myBooksTemp;
            }
         });

Другие вопросы по теме