段栏加载的事件在activityResumedEvent上调用

时间:2018-11-29 00:39:21

标签: android nativescript

在android上的NativeScript应用程序中,我使用了一个分段栏,并且我注意到,每次用户最小化应用程序并再次恢复时,都会调用(加载)事件。

y

这是预期的行为还是错误? 附言我正在加载的酒吧上进行API调用,每次活动恢复时,应用程序都会再次进行API调用。如果这是预期的行为,那么我可能需要处理该事件

x

2 个答案:

答案 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>