В моем приложении 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);
});
Я передал эту ошибку, используя флаг 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
}
Это не ошибка, а ожидаемое поведение. Загруженные события будут вызываться при каждом повторном использовании собственного представления, например, при возобновлении / переходе на предыдущую страницу. Я думаю, что использование здесь настроек приложения может быть накладным. Почему бы вам не попробовать удалить слушателя после первого использования?
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?
С Angular это немного сложно, я использую директиву, которая добавит слушателей к элементу только один раз. Позвольте мне поделиться этим в ответе.
спасибо за ваше редактирование, тем временем я протестировал исходное решение args.object.off ('loaded'); и это тоже нормально работает.
Да, это могло сработать. Но я бы рекомендовал придерживаться функций фреймворка и лучших практик.
Да, ради обходного пути я тоже делаю то же самое, и вместо сохранения в localstorage я использую логическое значение. Но интересно узнать, настоящая ли это ошибка?