2016-11-23 121 views
2

當Aurelia正在導航到新路由時,我試圖將class添加到html元素,以便我可以在加載時以不同的樣式對頁面進行樣式設置。檢測對router.is的改變

我目前的解決方案是將類添加到main元素,因爲這是我的觀一部分,所以它「只是工程」,是這樣的:

import {inject} from 'aurelia-framework'; 
import {Router} from 'aurelia-router'; 

@inject(Router) 
export class App { 
    constructor (router) { 
     this.router = router; 
    } 
} 

然後在我看來,我只是做:

<main class="${router.isNavigating ? 'loading' : ''}"> 
    <router-view></router-view> 
</main> 

但是,就像我提到的,我寧願到loading類添加到html元素,而不是(這樣我可以風格在頁面上每一個decendant)。由於html元素是而不是我的觀點的一部分,我不能以相同的方式完成這一點,但相反,我需要document.documentElement.classList.add('loading')每當router.isNavigating爲真。

所以我的問題是,我怎麼能做到這一點?我知道aurelia支持propertyChanged方法,但我不確定它是如何工作的,當它是嵌套的屬性,如router.isNavigating,routerIsNavigatingChanged()不起作用。我也嘗試過@computedFrom(router)及其變種,但無法使其發揮作用。

回答

2

好吧,所以我最終用EventAggregator來解決這個問題。

this.ea.subscribe('router:navigation:processing', event => { 
    document.documentElement.classList.add('loading'); 
}); 

this.ea.subscribe('router:navigation:success', event => { 
    document.documentElement.classList.remove('loading'); 
}); 

我不確定這是最好的解決方案,但它似乎工作。仍然想知道是否可以執行@computedFrom('router.isNavigating'),因爲嘗試引發錯誤。

+1

Fabio上面的回答相當於做了@computedFrom('router.isNavigating')',但我認爲使用EventAggregator的解決方案是正確的方法。 –

+0

我同意@AshleyGrant。 –

+0

傢伙讓我問..使用'isNavigating'來顯示/隱藏微調器,假設我在附加事件中有一個api調用..即使我的調用還沒有結束,微調將會隱藏? –

4

另一種解決方案可能是使用BindingEngine,但我認爲EventAggregator是一個更好的解決方案。我在這裏發佈這個只是爲了你的好奇心。

import {BindingEngine} from 'aurelia-binding'; 

export class App { 

    static inject = [BindingEngine]; 

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

    configureRouter(config, router) { 
     //... 
     this.router = router;   
    } 

    attached() { 
    this.navigationSubs = this.bindingEngine 
     .propertyObserver(this.router, 'isNavigating') 
     .subscribe(this.isNavigationChanged); 
    } 

    detached() { 
    this.navigationSubs.dispose(); 
    } 

    isNavigationChanged(newValue, oldValue) { 
    if (newValue) { 
     document.documentElement.classList.add('loading'); 
    } else { 
     document.documentElement.classList.remove('loading'); 
    } 
    } 

} 

另外,我不知道,如果設置htmlclass是不錯的主意。

+0

非常感謝您的參考。但是如果你們都認爲EA是最佳選擇,我想我會給自己一個答案。 – powerbuoy

+1

@powerbuoy當然!給自己答案! –

+0

我錯過了關於添加HTML類的評論。當談到全球風格的狀態時,我喜歡這樣做。就像是一個彈出窗口打開,或者頁面正在加載,或者其他什麼。在''上設置一個班級,不僅可以讓我爲每個孩子定製根元素bu。說到'html.loading',我所做的只是展示一個微調。將該類添加到實際的微調器中將會限制我的樣式選項,並將我的app.js與我的微調器HTML緊密結合,所以我絕對更喜歡'html.loading'方法。 – powerbuoy