2017-04-08 2 views
0

Ich möchte auf einen "Export" -Button klicken und auf eine Route "nach Hause" mit "Export" Abfrageparameter als wahr festgelegt. Ich möchte nicht, dass dieser Abfrageparameter meine Route aktualisiert. Also hier ist, wie ich meine Route wie folgt aussieht:Ändern der Abfrageparameter wird nicht in der URL angezeigt

export default Route.extend(ApplicationRouteMixin, { 
    queryParams: { 
    export: { 
     refreshModel: false 
    } 
    } 
}) 

In meinem Controller, ich versuche die Abfrage param zu beobachten und eine Funktion aufrufen, die den Export für mich tut und danach will ich die Abfrage param einstellen zurück zu null. hier ist mein Controller:

import Ember from 'ember' 
const {Controller, inject} = Ember 

export default Controller.extend({ 
    // == Dependencies ========================================================== 
    session: inject.service(), 
    // == Keyword Properties ==================================================== 
    queryParams: ['export'], 
    export: null, 

    queryParamsObserver: function() { 
    if (this.get('export')) { 
     this.exportFile() 
     this.set('export', null) 
    } 
    }.observes('export'), 

    // == Functions ============================================================= 
    exportFile() { 
    }, 

    // == Actions =============================================================== 
    actions: { 
    } 

}) 

Aber mein Problem ist, dass, wenn ich die Abfrage param auf null gesetzt, wird es nicht auf die URL ändern. Ich frage mich, was ich hier vermisse, das dieses Verhalten nicht verursacht. Plus, dass ich mich wundere, wenn das Beobachten von Abfrageparameter die beste Lösung ist, um einige Aktionen auszulösen.

+0

Also im Grunde wollen Sie 'export' immer Null sein, und verwenden Sie es nur für die Verknüpfung, um den Export auszulösen? – Lux

+0

Nun, nicht immer null, ich möchte, dass es null gesetzt wird, wenn ich anfänglich auf diese Route gehe, um die Datei herunterladen zu können. dann setze es gleich nach dem Download auf Null. Diese Export-Schaltfläche, die ich habe, ist in Anwendungsebene und von allen Routen aus zugänglich. Damit kann der Benutzer den Exportabfrageparameter durch Klicken auf die Schaltfläche "Export" wieder auf "True" setzen. – user5471528

Antwort

1

Das Problem mit Ihrem Fall hängt damit zusammen, dass Ihre Einstellung export innerhalb des Controllers zu früh ist, dass die Änderung der Abfrageparameter nicht in der URL reflektiert wird. Es ist nicht trivial, etwas über Ember.run-Schleifen zu erfahren. Sie sollten anfangen, über Lauf-Schleifen zu lernen, indem Sie following lesen.

Werfen Sie einen Blick auf die folgenden twiddle, wenn Sie die Einstellung von export innerhalb Ember.run.scheduleOnce wie in twiddle dann wickeln Sie werden sehen, export in der URL gelöscht. (In der Tat ist es sofort entfernt; Sie sehen nie, dass es wahr wird; wenn Sie beide Export-Funktion und Clearing von export Flag innerhalb eines Versprechens, sagen wir, dass wird nach einigen Sekunden aufgelöst, dann werden Sie sehen, es wird true werden dann entfernt werden).

In Bezug auf Ihre Frage zur Verwendung von Beobachtern; Ich kann nichts sehen, was du mit deinem aktuellen Design machen könntest. Der Grund ist, dass; Sie sagen, refreshModel ist falsch; Daher haben Sie keine verfügbaren Hook-Methoden, um die Funktion export in der Steuerung auszulösen, wenn Sie sich bereits auf derselben Route befinden. Sie müssen Ihr Design ändern; Was Ykaragol vorgeschlagen hat, könnte ein guter Ausgangspunkt sein.

1

Die erste Option, die eine service verwendet und den Export über die Anwendungsroute oder über die Schaltfläche Komponente auslöst, scheint für Ihre Situation besser geeignet zu sein. Sie können es von all Ihren Routen verwenden. Benutzer bleiben während des Exports auf derselben Route. Ich würde diese Option verwenden. Die zweite Option besteht darin, die exportFile in eine thennable Funktion umzuwandeln. Wenn der Export abgeschlossen ist, können Sie die QueryParams löschen. Hier ist a working twiddle für Sie.

Verwandte Themen