2016-11-23 4 views
2

Aureliaが新しいルートにナビゲートしているときに、htmlエレメントにclassを追加しようとしています。ルータへの変更を検出しました.isNavigating

私の現在のソリューションは、それが私のビューの一部ですので、それはこのように、「ただ働き」ので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> 

しかし、私が述べたように(私はページ上のすべての単一の降順のスタイルを設定できるように)、私が代わりにhtml要素にloadingクラスを追加することを好むだろう。 htmlの要素はではないので、私の見解の一部であるではありません。同じ方法でこれを達成することはできませんが、代わりにの場合はrouter.isNavigatingがtrueです。

私の質問です。どうすればこれを達成できますか?私はaureliaがpropertyChangedメソッドをサポートしていることを知っていますが、router.isNavigating、のようなネストされたプロパティの場合、どのように動作するのか分かりません。私も@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

人は私に聞かせてくれます..添付されたイベントでAPIコールを持っていると仮定して、スピナーを表示/非表示にするために 'isNavigating'を使用してください..私のコールがまだ終了していなくても、 –

4

BindingEngineを使用する別の解決策がありますが、私はEventAggregatorがより良い解決策だと思います。私はちょうどあなたの好奇心のためにここにこれを掲示しています。良いアイデアですhtmlclassを設定する場合

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'); 
    } 
    } 

} 

はまた、私はわかりません。

+0

これはありがとうございます、それは将来の参照のために良いです。しかし、あなたが両方ともEAが行く方法だと思うなら、私は自分自身に答えを与えるだろうと思う。 – powerbuoy

+1

@powerbuoyもちろん!あなた自身に答えてください! –

+0

HTMLクラスの追加に関するコメントがありませんでした。私はそれがグローバルスタイルの状態になると、それをするのが大好きです。ポップアップが開いているか、ページが読み込まれているかのように。 ''でクラスを設定すると、すべての子要素にルート要素buをスタイルするだけでなく、 'html.loading'については、スピナーを表示するだけです。実際のスピナーにクラスを追加すると、私のスタイリングのオプションが制限され、私のapp.jsとスピナーのHTMLが密接に結びつくので、私は 'html.loading'アプローチを間違いなく推奨します。 – powerbuoy

関連する問題