在android上的NativeScript应用程序中,我使用了一个分段栏,并且我注意到,每次用户最小化应用程序并再次恢复时,都会调用(加载)事件。
y
这是预期的行为还是错误? 附言我正在加载的酒吧上进行API调用,每次活动恢复时,应用程序都会再次进行API调用。如果这是预期的行为,那么我可能需要处理该事件
x
答案 0 :(得分:1)
我使用标志var传递了该错误,以标识是否已加载该视图,例如,在加载时,我保存了一个名为load = 1的var,然后在已加载事件的顶部检查是否已加载
var applicationSettings = require("application-settings");
var isloated = applicationSettings.getString("loaded",0);
if(isolated == 0){
here means that is the first time
}else{
do nothing
}
答案 1 :(得分:0)
这不是错误,而是预期的行为。每当回收本机视图时,就会调用已加载的事件,例如,恢复/导航回到上一页。我认为在这里使用应用程序设置可能会增加开销。为什么不尝试在首次使用后删除监听器?
export function onLoaded(args) {
// Removes any loaded event listeners attached in the object
args.object.off('loaded');
// Write code here
}
更新:上述解决方案可能非常适合Core应用程序,对于Angular,我们可以使用仅侦听给定事件一次的指令。
listen-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>