Событие загрузки панели сегмента вызывается в activityResumedEvent

В моем приложении NativeScript на Android я использую одну сегментную полосу, и я заметил, что (загруженное) событие вызывается каждый раз, когда пользователь минимизирует приложение и возобновляет его снова.

<SegmentedBar width = "100%" height = "100%" selectedIndex = "{{segmentedIndex}}" (selectedIndexChange) = "onSelectedIndexChange($event)"
                    style = "font-family: 'FontAwesome'" (loaded) = "onBarLoaded($event)">
                    <SegmentedBarItem title = "{{currentText | decodeHTML}}" class = "fa label-text-icon"></SegmentedBarItem>
                    <SegmentedBarItem title = "{{pastText | decodeHTML}}" class = "fa label-text-icon"></SegmentedBarItem>
                </SegmentedBar>
            </StackLayout>

это ожидаемое поведение или это ошибка? P.S. Я делаю вызов API на загруженной панели, и каждый раз, когда активность возобновляется, приложение снова вызывает вызов API. Если это ожидаемое поведение, мне может потребоваться обработать событие

android.on(AndroidApplication.activityResumedEvent, function (args: AndroidActivityEventData) {

        console.info("Event: " + args.eventName + ", Activity: " + args.activity);
    });
0
0
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я передал эту ошибку, используя флаг var, чтобы идентифицировать уже загруженное это представление, например, при загрузке я сохраняю var с именем loaded = 1, а затем в верхней части загруженного события проверяю, было ли оно загружено

var applicationSettings = require("application-settings");
var isloated = applicationSettings.getString("loaded",0);
if (isolated == 0){
   here means that is the first time
}else{
   do nothing
}

Да, ради обходного пути я тоже делаю то же самое, и вместо сохранения в localstorage я использую логическое значение. Но интересно узнать, настоящая ли это ошибка?

Narendra 29.11.2018 03:51
Ответ принят как подходящий

Это не ошибка, а ожидаемое поведение. Загруженные события будут вызываться при каждом повторном использовании собственного представления, например, при возобновлении / переходе на предыдущую страницу. Я думаю, что использование здесь настроек приложения может быть накладным. Почему бы вам не попробовать удалить слушателя после первого использования?

export function onLoaded(args) {
    // Removes any loaded event listeners attached in the object
    args.object.off('loaded');
    // Write code here
}

Обновлять: Вышеупомянутое решение может хорошо подходить для приложения Core, для Angular мы можем использовать директиву, которая будет прослушивать данное событие только один раз.

слушать-Once.directive.ts

import { Directive, OnInit, OnDestroy, Input, Output, EventEmitter, ElementRef, Renderer2 } from "@angular/core";

import { EventData } from "data/observable";
import { View } from "ui/core/view";

@Directive({
    selector: "[listenOnce]",
})
export class ListenOnceDirective implements OnInit, OnDestroy {

    @Input() eventName: string = View.loadedEvent;
    @Output() listenOnce: EventEmitter<EventData> = new EventEmitter();

    listener: () => void;

    constructor(private renderer: Renderer2, private el: ElementRef) { }

    ngOnInit() {
        this.listener = this.renderer.listen(this.el.nativeElement, this.eventName, (event: EventData) => {
            this.removeListener();
            this.listenOnce.emit(event);
        });
    }

    ngOnDestroy() {
        this.removeListener();
    }

    private removeListener() {
        if (this.listener) {
            this.listener();
            this.listener = null;
        }
    }
}

Убедитесь, что вы импортировали эту директиву в соответствующий модуль. Затем вы можете просто сделать это на сегментированной панели

<SegmentedBar width = "100%" height = "100%" selectedIndex = "{{segmentedIndex}}" (selectedIndexChange) = "onSelectedIndexChange($event)"
                style = "font-family: 'FontAwesome'" (listenOnce) = "onBarLoaded($event)">
                <SegmentedBarItem title = "{{currentText | decodeHTML}}" class = "fa label-text-icon"></SegmentedBarItem>
                <SegmentedBarItem title = "{{pastText | decodeHTML}}" class = "fa label-text-icon"></SegmentedBarItem>
            </SegmentedBar>
        </StackLayout>

У меня есть это для сегмента bar (loaded) = "onBarLoaded ($ event)". Вы имеете в виду удалить прослушиватель функции onBarLoaded?

Narendra 29.11.2018 07:25

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

Manoj 29.11.2018 07:29

спасибо за ваше редактирование, тем временем я протестировал исходное решение args.object.off ('loaded'); и это тоже нормально работает.

Narendra 29.11.2018 07:39

Да, это могло сработать. Но я бы рекомендовал придерживаться функций фреймворка и лучших практик.

Manoj 29.11.2018 07:41

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