Estoy creando una aplicación con angular + iónico que usa un menú clásico de tres botones en la parte inferior con tres pestañas de iones. Cuando un usuario hace clic en una pestaña, esa plantilla se abre a través de ui-router.
Tengo estados como este:
$stateProvider
.state('other', {
url: "/other",
abstract: true,
templateUrl: "templates/other/other.html"
})
En la plantilla hago algo como:
<ion-nav-view name="other" ng-init="doSomething()"></ion-nav-view>
Soy consciente de que puedo escribir la función doSomething () en mi controlador y simplemente llamarla manualmente allí. Sin embargo, eso me da el mismo problema. Parece que no puedo averiguar cómo llamar a la función doSomething () más de una vez, cada vez que alguien abre esa vista.
En este momento, la función doSomething () se llama bien, pero solo la primera vez que el usuario abre esa vista / pestaña. Me gustaría llamar a una función (para actualizar la geolocalización) cada vez que un usuario abre esa vista o pestaña.
¿Cuál sería la forma correcta de implementar eso?
¡Gracias por ayudar!
fuente
Respuestas:
Si ha asignado un cierto controlador a su vista, entonces se invocará su controlador cada vez que se cargue su vista. En ese caso, puede ejecutar algún código en su controlador tan pronto como se invoca, por ejemplo, de esta manera:
<ion-nav-view ng-controller="indexController" name="other" ng-init="doSomething()"></ion-nav-view>
Y en tu controlador:
app.controller('indexController', function($scope) { /* Write some code directly over here without any function, and it will be executed every time your view loads. Something like this: */ $scope.xyz = 1; });
Editar: puede intentar rastrear los cambios de estado y luego ejecutar algún código cuando se cambia la ruta y se visita una determinada ruta, por ejemplo:
$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){ ... })
Puede encontrar más detalles aquí: Eventos de cambio de estado .
fuente
cache-view
en falso ayudará? ionicframework.com/docs/api/directive/ionView búsqueda de vista de cachéDe forma predeterminada, sus controladores estaban en caché y es por eso que su controlador solo se disparó una vez. Para desactivar el almacenamiento en caché de un controlador determinado, debe modificar su
.config(..).state
y establecer lacache
opción enfalse
. p.ej :.state('myApp', { cache: false, url: "/form", views: { 'menuContent': { templateUrl: "templates/form.html", controller: 'formCtrl' } } })
para obtener más información, visite http://ionicframework.com/docs/api/directive/ionNavView/
fuente
$state.go('app.statename', {}, {reload:true});
( más información , fuente ).Siguiendo la respuesta y el enlace de AlexMart , algo como esto funciona:
.controller('MyCtrl', function($scope) { $scope.$on('$ionicView.enter', function() { // Code you want executed every time view is opened console.log('Opened!') }) })
fuente
$ionicView.beforeEnter
es probablemente lo que quieres.$ionicView.enter
se dispara después de que "la vista haya entrado completamente" . Si está utilizando transiciones de vista animadas, el uso se$ionicView.beforeEnter
ejecuta antes de que comience la transición. Esto significa que puede ejecutar su código durante la transición, lo que probablemente dará lugar a una sensación más "ágil" en su aplicación.Me enfrenté al mismo problema, y aquí dejo el motivo de este comportamiento para todos los demás con el mismo problema.
Para ver la descripción completa y los eventos de $ ionicView, visite: http://ionicframework.com/blog/navigating-the-changes/
fuente
¿Por qué no deshabilita la caché de vista con cache-view = "false" ?
En su vista, agregue esto a la vista de navegación de iones de esa manera:
<ion-nav-view name="other" cache-view="false"></ion-nav-view>
O en su estado Proveedor:
$stateProvider.state('other', { cache: false, url : '/other', templateUrl : 'templates/other/other.html' })
Cualquiera de los dos hará que su controlador sea llamado siempre.
fuente
Por ejemplo a @Michael Trouw,
dentro de su controlador ponga este código. esto se ejecutará cada vez que se ingrese o se active este estado, no necesita preocuparse por deshabilitar el caché y es un mejor enfoque.
.controller('exampleCtrl',function($scope){ $scope.$on('$ionicView.enter', function(){ // Any thing you can think of alert("This function just ran away"); }); })
Puede tener más ejemplos de flexibilidad como $ ionicView.beforeEnter -> que se ejecuta antes de que se muestre una vista. Y hay algunos más.
fuente
Teniendo en cuenta la capacidad de Ionic para almacenar en caché los elementos de vista y los datos de alcance mencionados anteriormente, esta podría ser otra forma de hacerlo, si desea ejecutar el controlador cada vez que se carga la vista. Puede deshabilitar globalmente el mecanismo de almacenamiento en caché utilizado por ionic haciendo:
$ionicConfigProvider.views.maxCache(0);
De lo contrario, la forma en que lo hice funcionar para mí fue
$scope.$on("$ionicView.afterLeave", function () { $ionicHistory.clearCache(); });
Esto es para borrar la caché antes de salir de la vista para volver a ejecutar el controlador cada vez que ingrese nuevamente.
fuente
Probablemente esto es lo que estabas buscando:
Ionic almacena en caché sus vistas y, por lo tanto, sus controladores de forma predeterminada (máximo de 10) http://ionicframework.com/docs/api/directive/ionView/
Hay eventos a los que puede conectarse para permitir que su controlador haga ciertas cosas en función de esos eventos iónicos. vea aquí un ejemplo: http://ionicframework.com/blog/navigating-the-changes/
fuente
ViewContentLoading
yViewContentLoaded
eventos fijos de angular-ui-router :)Tuve un problema similar con iónico en el que intentaba cargar la cámara nativa tan pronto como seleccionaba la pestaña de la cámara. Resolví el problema configurando el controlador en el componente ion-view para la pestaña de la cámara (en tabs.html) y luego llamando al método $ scope que carga mi cámara (addImage).
En www / templates / tabs.html
<ion-tab title="Camera" icon-off="ion-camera" icon-on="ion-camera" href="#/tab/chats" ng-controller="AddMediaCtrl" ng-click="addImage()"> <ion-nav-view name="tab-chats"></ion-nav-view> </ion-tab>
El método addImage, definido en AddMediaCtrl carga la cámara nativa cada vez que el usuario hace clic en la pestaña "Cámara". Yo no tengo que cambiar nada en la memoria caché angular para que esto funcione. Espero que esto ayude.
fuente