2015-09-24 5 views
11

Ich habe gerade eine Anfrage von unserem QA-Team bekommen, was ich lächerlich finde. Hier geht es: Angenommen, Sie befinden sich bereits in der eckigen App auf dem Status 'ungefähr' und wenn Sie im oberen Menü erneut auf die Status-URL 'about' klicken, möchten Sie, dass die Seite 'about' neu geladen wird. Die about Seite holt keine Daten von irgendwo her, ein Nachladen ist übrigens gleichbedeutend mit einem Blinzeln.AngularJS mit ui.router: Seite neu laden, wenn man auf denselben Statuslink klickt

Für den Staat config in meinem Winkel App ist wie folgt:

.state('about', { 
    url: '/about', 
    templateUrl: '/path/to/about.html', 
    controller: 'aboutCtrl as aboutView' 
}); 

Und in den oberen Menüs, haben wir einen Link zu diesem Zustand zeigen:

<a ui-sref="about">About</a> 

ich viele Dinge ausprobiert haben Um dies zum Laufen zu bringen: Klicken auf den Link löst das erneute Laden desselben Status aus.

Dinge wie $state.go('about', {}, {reload: true}); oder $state.transitionTo('about', {}, {reload: true}); funktionieren nicht, weil die Links statisch sind.

Ein letzter Ausweg, den ich derzeit versuche, ist das Manipulieren der Reload-Sache in der run Phase von Angular durch Hören auf '$stateChangeSuccess' Ereignis, aber ich glaube nicht, dass es funktioniert, weil es keine Zustandsänderung überhaupt gibt, wenn Sie auf klicken die 'about' Verbindung, während Sie in diesem Zustand sind.

Gibt es Möglichkeiten, dies zu umgehen? Danke

+4

"Ich habe eine Anfrage von unserem QA-Team, das ich denke, klingt lächerlich" - made my day ty – scniro

+0

froh, bekommt man ein gutes Lachen. Ich denke, das ist eine lächerliche Anfrage und ich denke, es ist unmöglich mit ui.router zu tun. Ich warte auf einen Experten, um mich aufzuklären. Danke – TonyGW

+1

Ich denke nicht, dass das erneute Laden der Seite über (die ich vermute, ist statisch) ein guter Weg aus mehreren Gründen ist - Ihre App sollte nur dem Benutzer anzeigen, dass sie bereits auf dieser Seite sind. Ein gutes Beispiel ist die Animation von Material Design, wenn Sie immer wieder auf dieselbe Registerkarte klicken - https://material.angularjs.org/latest/#/demo/material.components.Tabs – JaKXz

Antwort

17

Es gibt eine Option Attribut namens ui-sref-setzt, die mit dem UI-Router kommt. Ich hatte das gleiche Problem und es hat es gelöst.

ZB: <a ui-sref="home" ui-sref-opts="{reload: true}">Home</a>

Docs URL: UI Router DOcs

+1

Das hat bei mir funktioniert, danke! – ChrisDevWard

+0

Beste Lösung für dieses Problem, danke! –

7

Du hast recht, ich kann keine state change events bekommen, entweder schon einmal in diesem Zustand zu feuern. Bis, und wenn diese Funktionalität verfügbar ist, um durch diesen einen Tag zu verwenden, ist hier eine semi-hacky Lösung dafür. Wir können einfach ng-click nutzen und eine dumme Logik verwenden, um QA (in Ihrem Fall) zu beschwichtigen. Außerdem kenne ich Ihre Controller-Implementierung nicht, deshalb habe ich in diesem Beispiel meinen Vorschlag auf $rootScope in .run für Einfachheit und Sichtbarkeit platziert, aber integrieren Sie entsprechend, wenn Sie sich dazu entscheiden. Beachten Sie das folgende Beispiel ...

<a ui-sref="about" ng-click="sillyQA()">About</a> 

.run(['$rootScope', '$state', function($rootScope, $state) { 

    $rootScope.sillyQA = function() { 
     if($state.current.name === 'about') { 
      $state.go('about', {}, { reload: true }); 
     } 
    } 

    // -- just to see our about => about state 'change' 
    $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){ 
     console.log('toState: ' + toState.name); 
     console.log('fromState: ' + (fromState.name || 'Just got there! click again!')); 
    }) 
}]); 

JSFiddle Link - Demo

+0

Vielen Dank, schön erklärt! Ich war mehr irritiert, als ich diese Anfrage von QA erhielt. Weil der Benutzer das Browserfenster immer aktualisieren kann, wenn das erneute Laden erforderlich ist. Ich sehe keinen Sinn darin, denselben Link erneut anzuklicken, um ihn erneut zu laden. LOL – TonyGW

+0

@TonyGW Ich höre wo du herkommst! Ich kann mir nur eine Situation vorstellen, in der es einen konstanten Feed gibt, wie zum Beispiel die neuesten Fragen zu SO. Ich könnte den ganzen Tag auf das Logo klicken, wenn ich meinen Feed "aktualisieren" möchte, anstatt meinen Browser explizit zu aktualisieren. Wie auch immer, Happy Coding und ich bin froh, dass das helfen konnte :) – scniro

+0

Tatsächlich enthält die Seite nur ein Formular für Benutzereingaben. Es erhält keine Daten von überall. QA-Leute machen mich manchmal verrückt ... – TonyGW