Ich baue eine App mit Angular + Ionic, die ein klassisches Drei-Tasten-Menü unten mit drei Ion-Tabs verwendet. Wenn ein Benutzer auf eine Registerkarte klickt, wird diese Vorlage über den UI-Router geöffnet.
Ich habe Zustände wie diesen:
$stateProvider
.state('other', {
url: "/other",
abstract: true,
templateUrl: "templates/other/other.html"
})
In der Vorlage mache ich so etwas wie:
<ion-nav-view name="other" ng-init="doSomething()"></ion-nav-view>
Mir ist bewusst, dass ich die Funktion doSomething () in meinen Controller schreiben und dort einfach manuell aufrufen kann. Das gibt mir aber das gleiche Problem. Ich kann nicht mehr als einmal herausfinden, wie man die Funktion doSomething () aufruft, wenn jemand diese Ansicht öffnet.
Im Moment wird die Funktion doSomething () problemlos aufgerufen, aber nur beim ersten Öffnen dieser Ansicht / Registerkarte durch den Benutzer. Ich möchte eine Funktion aufrufen (um die Geolokalisierung zu aktualisieren), wenn ein Benutzer diese Ansicht oder Registerkarte öffnet.
Was wäre ein korrekter Weg, um das umzusetzen?
Vielen Dank für Ihre Hilfe!
quelle
Antworten:
Wenn Sie Ihrer Ansicht einen bestimmten Controller zugewiesen haben, wird Ihr Controller jedes Mal aufgerufen, wenn Ihre Ansicht geladen wird. In diesem Fall können Sie Code in Ihrem Controller ausführen, sobald er aufgerufen wird, beispielsweise auf folgende Weise:
Und in Ihrem Controller:
Bearbeiten: Sie können versuchen, Statusänderungen zu verfolgen und dann Code auszuführen, wenn die Route geändert und eine bestimmte Route besucht wird. Beispiel:
Weitere Details finden Sie hier: Statusänderungsereignisse .
quelle
cache-view
hilft die Einstellung auf false? ionicframework.com/docs/api/directive/ionView Suche nach Cache-AnsichtStandardmäßig waren Ihre Controller Cache und deshalb wurde Ihr Controller nur einmal ausgelöst. Um das Caching für einen bestimmten Controller zu deaktivieren, müssen Sie Ihren ändern
.config(..).state
und diecache
Option auf setzenfalse
. z.B :Weitere Informationen finden Sie unter http://ionicframework.com/docs/api/directive/ionNavView/.
quelle
$state.go('app.statename', {}, {reload:true});
( weitere Informationen , Quelle ).Verfolgen Sie die Antwort und den Link von AlexMart funktioniert so etwas:
quelle
$ionicView.beforeEnter
ist wahrscheinlich was du willst.$ionicView.enter
wird ausgelöst, nachdem "die Ansicht vollständig eingegeben wurde" . Wenn Sie animierte Ansichtsübergänge verwenden, wird die$ionicView.beforeEnter
Ausführung ausgeführt, bevor der Übergang beginnt. Dies bedeutet, dass Sie Ihren Code während des Übergangs ausführen können, was wahrscheinlich zu einem "schnelleren" Gefühl in Ihrer App führt.Ich hatte das gleiche Problem, und hier überlasse ich den Grund für dieses Verhalten allen anderen mit dem gleichen Problem.
Eine vollständige Beschreibung und $ ionicView-Ereignisse finden Sie unter: http://ionicframework.com/blog/navigating-the-changes/
quelle
Warum deaktivieren Sie den Ansichtscache nicht mit cache-view = "false" ?
Fügen Sie in Ihrer Ansicht Folgendes zur Ion-Navi-Ansicht hinzu:
Oder in Ihrem StateProvider:
In beiden Fällen wird Ihr Controller immer aufgerufen.
quelle
Zum Beispiel an @Michael Trouw,
Geben Sie diesen Code in Ihren Controller ein. Dies wird jedes Mal ausgeführt, wenn dieser Status eingegeben oder aktiv ist. Sie müssen sich keine Gedanken über das Deaktivieren des Caches machen und es ist ein besserer Ansatz.
Sie können weitere Beispiele für Flexibilität wie $ ionicView.beforeEnter -> verwenden, die ausgeführt werden, bevor eine Ansicht angezeigt wird. Und da steckt noch mehr dahinter.
quelle
In Anbetracht der oben erwähnten Fähigkeit von Ionic, Ansichtselemente und Bereichsdaten zwischenzuspeichern, kann dies eine andere Möglichkeit sein, wenn Sie den Controller jedes Mal ausführen möchten, wenn die Ansicht geladen wird. Sie können den von ionic verwendeten Caching-Mechanismus global deaktivieren, indem Sie Folgendes tun:
$ionicConfigProvider.views.maxCache(0);
Sonst war es so, wie ich es für mich arbeiten ließ
Dies dient dazu, den Cache zu leeren, bevor Sie die Ansicht verlassen, um den Controller bei jeder erneuten Eingabe erneut auszuführen.
quelle
Dies ist wahrscheinlich das, wonach Sie gesucht haben:
Ionic speichert Ihre Ansichten und damit Ihre Controller standardmäßig zwischen (maximal 10) Http://ionicframework.com/docs/api/directive/ionView/
Es gibt Ereignisse, an die Sie sich anschließen können, damit Ihr Controller bestimmte Dinge basierend auf diesen ionischen Ereignissen ausführen kann. Ein Beispiel finden Sie hier: http://ionicframework.com/blog/navigating-the-changes/
quelle
ViewContentLoading
undViewContentLoaded
Ereignisse des Winkel-UI-Routers :)Ich hatte ein ähnliches Problem mit ionic, bei dem ich versuchte, die native Kamera zu laden, sobald ich die Registerkarte Kamera auswählte. Ich habe das Problem behoben, indem ich den Controller auf die Ionenansichtskomponente für die Registerkarte "Kamera" (in tabs.html) eingestellt und dann die Methode "$ scope" aufgerufen habe, mit der meine Kamera geladen wird (addImage).
In www / templates / tabs.html
Die in AddMediaCtrl definierte addImage-Methode lädt die native Kamera jedes Mal, wenn der Benutzer auf die Registerkarte "Kamera" klickt. Ich habe nicht müssen für diese Arbeit etwas im Winkel Cache ändern. Ich hoffe das hilft.
quelle