angularjs - uirouter - UI-Router: ¿Puedo obtener siempre el mismo controlador?
ui router angularjs tutorial (1)
Estoy usando UI-Router para tener algunos "menús" en mi aplicación.
$stateProvider.state("list"
url: "/Focales"
templateUrl: "/demo/focals.html"
controller: FocalCtrl)
$stateProvider.state("collection"
url: "/Collections"
templateUrl: "/demo/collections.html"
controller: CollectionCtrl)
En mi CollectionCtrl, desencadenaré un procesamiento hecho en el servidor y estoy esperando para mostrar la información de esta manera (CoffeeScript)
Progress = $resource(''/collections/getProgress'')
$scope.getProgress = () ->
prg = Progress.get {}, ->
$scope.currentProgress = prg
$scope.getProgress() if prg.end isnt true
Mi problema: cuando el usuario se muda a Focal y vuelve a CollectionCtrl, tengo una nueva instancia de CollectionCtrl. Por lo que entiendo, el código $ scope.getProgress aún recibe datos, pero para el CollectionCtrl ANTERIOR (para que la pantalla no se actualice ...)
¿Es posible obtener el Controlador anterior en lugar de una nueva "instancia" de CollectionCtrl? ¿Por qué se crea un nuevo CollectionCtrl? ¿Cuál es el mejor enfoque? Así que estoy tentado de tener datos de estado para almacenar el $ scope actual, así que podría hacer $ state.currentScope = prg en lugar de $ scope.currentProgress = prg. ¿Es un buen enfoque?
Gracias !
El mejor enfoque para tomar aquí es definir un servicio que se comunicará con el servidor y posiblemente almacenará en caché los resultados. Este servicio se puede inyectar en los Controladores y los controladores pueden solicitar el progreso , probablemente usando $watch
, aunque proporcionar el servicio con una devolución de llamada también puede ser suficiente y actualizar la UI en función de eso.
Los controladores deben ser efímeros y uno no debe confiar en que sean objetos únicos en Angular. Es importante destacar que no deben contener ningún estado aparte de lo que necesita la plantilla que están apoyando. Se crean de nuevo cuando la ruta se activa para que podamos escribir código comparativamente más simple, inicializando el $scope
una vez y podemos estar seguros de que contendrá como nueva información (como la ruta) para la plantilla como sea posible. Esto también evita fugas de memoria si se mantiene un controlador alrededor de cada ruta como /app/:object_id
y el usuario cambia de ruta con frecuencia.