Angular изменение значения не замечено в HTML - PullRequest
0 голосов
/ 20 июня 2020

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

Функция в component.ts:

    public async startDefault(): Promise<void> {
        try {
            this.oDefaultLoader.startLoading();
            this.setNewvalues("api", {
                max: 1,
                cur: 0
            });
            setTimeout((): void => {
                this.setNewvalues("api", {
                    max: 19,
                    cur: 5
                });
            }, 6000);
            await this.electron.sendIpcPipe("startDefault", async (oData: IIpcChainResponse): Promise<void> => {
                console.log(oData);
                this.setNewvalues("api", {
                    max: oData.max,
                    cur: oData.cur
                });

            }, this.settings.oSetting);
            this.oDefaultLoader.stopLoading();
        } catch (oErr) {
            this.oDefaultLoader.stopLoading();
            console.log(oErr);
        }
    }

    // Background Actions
    private setNewvalues(sSet: "api" | "bo", oValues: IProgressObject): void {
        this.oDefaultStart = deepMergeObject(this.oDefaultStart, {
            [sSet]: oValues
        } as IDefaultStart);
        console.log(this.oDefaultStart.api);
    }

Функция sendIpcPipe:

    public async sendIpcPipe<T, U>(sEndpoint: string, fnPipe: (data: T) => Promise<void>, oArgs?: U): Promise<void> {
        if (this.electron.isElectronApp) {
            return new Promise<void>((resolve: Function, _reject: Function): void => {
                const oListener: (_event: Electron.IpcRendererEvent, oResponse: T) => Promise<void> = async (
                    _event: Electron.IpcRendererEvent,
                    oResponse: T
                ): Promise<void> => {
                    if (oResponse as unknown as number === 0) {
                        this.electron.ipcRenderer.off(sEndpoint + "Response", oListener);
                        resolve();
                    } else {
                        await fnPipe(oResponse);
                    }
                };
                this.electron.ipcRenderer.on(sEndpoint + "Response", oListener);
                this.electron.ipcRenderer.send(sEndpoint, oArgs);
            });
        }
        return;
    }

Код HTML только для показа объект:

<div>
    {{ oDefaultStart.api | json }}
</div>

Обновление

Если я использую setNewvalues вне функции обратного вызова sendIpcPipe, он работает нормально. Но снаружи ничего или лишь иногда что-то не менялось.

1 Ответ

0 голосов
/ 20 июня 2020

Лучший способ реагировать на изменения значения - использовать magi c из RX JS.

Я бы сделал oDefaultStart как BehavioralSubject, а затем использовал asyn c pipe в HTML .

Если вы новичок в RX JS, посмотрите это полезное видео https://www.youtube.com/watch?v=ewcoEYS85Co

...