2014-01-29 4 views
26

Lassen Sie uns sagen, dass wir eine Eltern-Kind-Beziehung in unserem $ stateProvider definiert haben, wie folgt:Wie wird der Elternstatus von angular ui-router immer ausgeführt, wenn der Status des Controllers geändert wird?

.state('myProfile', { 
     url: "/my/profile", 
     templateUrl: 'my/profile.html', 
     controller: 'MyProfileController' 
    }).state('myProfile.edit', { 
     url: "/edit", 
     templateUrl: 'my/profile.edit.html', 
     controller: 'EditMyProfileController' 
    }); 

Die Idee dabei ist, dass die Mutter myProfile Zustand ist nicht editierbar, aber das Kind myProfile.edit Zustand ist die tatsächliche Form zu Bearbeiten Sie das Profil. Lassen Sie uns ignorieren, wenn eine Profilseite so funktionieren sollte - ich spiele nur mit Dingen herum und lerne.

Wenn ein Benutzer das Formular abschickt, verwende ich das $ Zustand Objekt zur übergeordneten Seite gehen zurück:

$scope.save = function() { 
    userResource.update($scope.user, function() { 
     SessionService.refresh(); 

     $state.go('myProfile'); // also tried with reload: true as well 
    }); 
} 

Nachdem der Benutzer speichert die Profildaten - und es ist gespeichert immer richtig - die Die Ansicht des Elternteils wird nur aktualisiert, wenn ich F5 drücke und den Browser aktualisiere. Ein Ding, das ich bemerkt habe, ist, dass, wenn ich das Kind myProfile.edit Zustand in ein Elternteil selbst und kein Kind des myProfile Zustand mache, geht dieses Problem tatsächlich weg und Dinge verhalten sich wie erwartet (obwohl das Layout sieht so schlecht aus).

Es scheint, dass UI Router möglicherweise das Ergebnis des Elternteils zwischenspeichert, ahnungslos, dass sich die Dinge im Modell geändert haben und der Controller erneut ausgeführt werden muss?

Wie kann ich meine Eltern-Kind-Beziehung beibehalten, während die übergeordnete myProfile Seite immer ihren Controller ausführt, um ihre Daten erneut zu laden? Grundsätzlich möchte ich, dass dies geschieht, wenn $state verwendet wird oder wenn ein Link angeklickt wird, der auf myProfile verweist. Wie kann ich das machen?

Und wenn ich nicht tun kann, was ich frage, dann bin ich mir bewusst, dass ich eine Reihe von Kinderzuständen einrichten und sie wie vorgesehen arbeiten lassen kann ... Wie kann ich jedoch den Standard-Kindstatus für Eltern festlegen? Angenommen, ich möchte myProfile.edit als Standard-Kindstatus von myProfile angeben - wie kann ich das tun?

Danke!

Antwort

3

Haben Sie versucht, auf das Ereignis "$ stateChangeStart" zu hören und/oder $ state.reload() zu verwenden?

33

Um zu erzwingen, dass ein Elternstatus neu geladen wird, wenn Sie aus einem Kind-Status zu ihm navigieren, können Sie beide Möglichkeiten unten verwenden. Pure js oder ein direktives Attribut.

<a ui-sref="myProfile" ui-sref-opts="{ reload: true }">Back to My Profile</a> 

oder

$state.go('myProfile', null, { reload: true }); 
+2

Dies ist hilfreich, aber in meinem Fall habe ich href, weil sie von einem CMS kommen. Ich kann nicht herausfinden, wie Reload in diesem Fall auf "True" gesetzt wird. – drye

+0

Ich wünschte, ich könnte zweimal upvote - danke! – Ben

+1

Ich habe auch das gleiche Problem. Ich komme auch von einem 3rd-Party-System. – DragonDTG

2

Scheint, wie es einen Fehler auf $ state.go ist, die die Reload-Optionen Weglassen wird. $ state.transitionTo funktioniert jedoch für mich.

$state.transitionTo('state',null,{reload: true}); 
Verwandte Themen