HTTP-ответ обновления Nativescript при запуске приложения

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

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from "@angular/router";
import { switchMap } from 'rxjs/operators';
import { Building } from "../shared/building/building";
import { HttpService } from "../services/http/http.service";
import {
    getString,
    setString
} from "application-settings";

@Component({
    moduleId: module.id,
    selector: 'building-detail',
    templateUrl: 'building-detail.component.html',
    styleUrls: ["./building-detail-common.css"],
    providers: [ Building, HttpService ]
})

export class BuildingDetailComponent implements OnInit {
    paramName: string;
    constructor(
        private route: ActivatedRoute, 
        public building: Building, 
        private httpService: HttpService) {
        this.route.params.subscribe(
            (params) => {
                this.paramName = params['name']
            } 
        );
    }

    ngOnInit() {
        console.log("ON INIT FIRED " + this.paramName);
        let buildingInfo = JSON.parse(getString("buildingInfo"));
        for (let item of buildingInfo) {
            if (item.attributes.title === this.paramName) {
                this.building.name = item.attributes.title;
                this.building.desc = item.attributes.body.value;
                let imageEndpoint = "file/file/" + item.relationships.field_building_image.data.id;
                let imageUrl = this.httpService.getData(imageEndpoint)
                .subscribe(data => { 
                    this.building.image = "https://nav.abtech.edu" + data['data'].attributes.url;
                    console.log("The building image URL is " + this.building.image);
                }, (error) => {
                    console.log("Error is " + error);
                });
            }
        }

     }
}

Я рад поделиться другими файлами/кодом, если вы хотите взглянуть на них. Спасибо!


person Mark Locklear    schedule 06.11.2018    source источник
comment
С какой платформой у вас возникла эта проблема? Можете ли вы показать нам GIF того, что вы видите?   -  person Manoj    schedule 06.11.2018
comment
Вот скриншот из приложения: snag.gy/KIwZQY.jpg   -  person Mark Locklear    schedule 06.11.2018
comment
Причина, по которой я специально попросил GIF, состоит в том, чтобы понять, с чем именно вы столкнулись. ngOnInit — это то, что выполняется только при создании вашего компонента, оно больше никогда не будет выполняться. Также существует разница между запуском приложения и возобновлением работы. Если вы хотите обновлять данные каждый раз, когда пользователь открывает приложение, вы должны прослушивать событие возобновления и выполнять вызовы API внутри ngZone.   -  person Manoj    schedule 06.11.2018
comment
Данные не меняются очень часто на бэкэнде. Есть ли способ принудительно переустановить для людей, у которых уже установлено приложение. Поднять версию может быть?   -  person Mark Locklear    schedule 07.11.2018
comment
Извините, это абсолютно ненужно или вообще не имеет смысла. Просто извлекайте данные, когда хотите, например, всякий раз, когда пользователь открывает/возобновляет приложение. Используйте push-уведомление/сообщение с данными, если вы хотите немедленно уведомить пользователя об изменении данных на бэкэнде.   -  person Manoj    schedule 07.11.2018
comment
Подытожил наше обсуждение как ответ, так что это может помочь другим.   -  person Manoj    schedule 07.11.2018


Ответы (2)


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

Если вы не хотите показывать кешированное значение, не читайте из настроек приложения или, по крайней мере, не читайте из appSettings, пока вы не обновите данные один раз.

person msenne    schedule 14.11.2018

ngOnInit — это то, что выполняется только при создании вашего компонента, оно больше никогда не будет выполняться.

Также существует разница между запуском приложения и возобновлением работы. Если вы хотите обновлять данные каждый раз, когда пользователь открывает приложение, вы должны прослушивать событие возобновления и выполнять вызовы API внутри ngZone.

Вы даже можете использовать push-уведомление/сообщение с данными, если хотите немедленно уведомить пользователя об изменении данных на бэкэнде.

person Manoj    schedule 07.11.2018