Aurelia事件不会在第一页加载时触发

时间:2016-08-08 12:15:11

标签: aurelia aurelia-event-aggregator

我正在使用Aurelia的loading在我的应用中发布和订阅活动。我的一些自定义元素需要一段时间才能加载,因此我使用app.js事件告诉我的主subscribe在加载过程中向页面添加微调器。

一旦应用程序加载并且我开始在路径之间切换,这样可以正常工作,但是,在第一页加载时,事件似乎没有触发 - 或者至少,它不会被app.js拾取方法

这基本上是我的attached () { this.mainLoadingSubscription = this.eventAggregator.subscribe('main:loading', isLoading => { // If main is loading if (isLoading) { document.documentElement.classList.add('main-loading'); } // Stopped loading else { document.documentElement.classList.remove('main-loading'); } }); } 所做的:

constructor () {
    this.eventAggregator.publish('main:loading', true);
}

attached () {
    this.doSomeAsyncAction.then(() => {
        this.eventAggregator.publish('main:loading', false);
    });
}

这就是我的自定义元素:

Promise

这导致第一页加载到而不是显示一个微调器,而页面看起来有点破碎。

顺便说一句,我知道您可以从元素的attached方法返回Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.Highlight = True With Selection.Find .Text = "[0-9]{1,2}.[0-9]{1,2}%" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True End With Selection.Find.Execute Replace:=wdReplaceAll ,但由于webhooks

我无法做到这一点

1 个答案:

答案 0 :(得分:1)

在viewModel的构造函数中设置订阅或激活回调

在上面的示例中,您在viewModel的attached()回调中设置了订阅。不幸的是,在调用所有子自定义元素的attached()回调之后才会调用此方法,这在调用任何一个自定义元素的constructor()函数之后很久。

试试这个:

app.js

@inject(EventAggregator)
export class AppViewModel {

    constructor(eventAggregator) {
        this.mainLoadingSubscription = eventAggregator.subscribe('main:loading', isLoading => {
            // do your thing
        }
    }
}

如果viewModel是可以导航到的路由,则在activate()回调中处理此问题,并在deactivate()回调中进行适当的拆分。

@inject(EventAggregator)
export class AppViewModel {

    constructor(eventAggregator) {
        this.eventAggregator = eventAggregator;
    }

    activate() {
        this.mainLoadingSubscription = this.eventAggregator.subscribe('main:loading', isLoading => {
            // do your thing
        }
    }

    deactivate() {
        this.mainLoadingSubscription.dispose();
    }
}