Suponga que se está discutiendo que estoy construyendo una aplicación de cotizaciones bursátiles y que necesito que los precios se actualicen cada 2 segundos, tengo un recurso $ envuelto sobre llamadas a un WebApi y variables de alcance $ en mi controlador que mantienen los resultados de esas llamadas de recursos $ .

Estoy trabajando desde una modificación de la muestra en la documentación angular para $ intervalo. La principal diferencia es que dentro de mi intervalo, estoy actualizando una variable $ scoped a los resultados de un recurso $.

He estado trabajando con la resolución de promesa automática de Angular para vincular mis variables, pero ahora que tengo mis símbolos actualizando en un intervalo, los datos se borran cada vez que se activa el intervalo y no se muestran hasta que se resuelve la promesa, así que obtener un "efecto de limpiaparabrisas" en mi vista. Lo que realmente quiero es que se muestren los "datos antiguos" hasta que regrese la promesa, en cuyo momento, los resultados se incluirán en mi variable de alcance y el rebote de la vista.

¿Cuál sería la forma más sencilla de hacer esto con el siguiente código?

Intenté introducir una variable intermedia, asignarla a la promesa de $ resource.Bars () y registrar una devolución de llamada exitosa dentro del intervalo, pero la devolución de llamada exitosa nunca se activa.

'use strict';
var ctrls = angular.module('MyModule',[]);
ctrls.controller('FooCtrl', ['$scope', '$location','$interval','$document','service',
  function( $scope,$location,$interval,$document,service)
  {
     var stop;
$scope.Bars = {};
$scope.Baz = service.Baz; //Note that angular resolves this promise automatically.
$scope.pollService = function(){
   if(angular.isDefined(stop))return;
   stop = $interval(function(){
     if(service){
        $scope.Bars = service.Bars();
     }
   },1000);
};
$scope.stopPolling = function(){
   if(angular.isDefined(stop)){
     $interval.cancel(stop);
     stop = undefined;
   }
};
$scope.$on('$destroy',function(){
 $scope.stopPolling();
    });
    $document.ready(function(){
       $scope.pollService(); 
    });
  }


var app = angular.module('MyModule.Services',['ngResource']);
app.service('service', ['$resource', function($resource)
{
    var proxy = $resource(
    'http://server/subsystem/api/Foo/:component',
    {},
    {
        Bars: {method:'GET',isArray:false,url: 'http://server/subsystem/api/Foo/Bars'
       ,Baz: {method:'GET',isArray:false,rul: 'http://server/subsystem/api/Foo/Baz'
    }
    return proxy;
}]);

Editar

Un colega pudo ayudarme poco después de que publiqué mi pregunta. Intenté registrar una devolución de llamada exitosa a través de .then () en la promesa y eso aparentemente es incorrecto. La devolución de llamada exitosa se puede colocar directamente dentro de la llamada service.Bars() como primer argumento. Entonces, en este caso, mi código se convirtió en

$scope.pollService = function(){
   if(angular.isDefined(stop))return;
   stop = $interval(function(){
     if(service){
        service.Bars(function(data){
            if(data) $scope.Bars = data;
        });
     }
   },1000);
};
0
K. Alan Bates 3 sep. 2014 a las 18:01

2 respuestas

La mejor respuesta
service.Bars(function(data){
   if(data)$scope.Bars = data;
});

Era el droide que estaba buscando

0
K. Alan Bates 11 oct. 2014 a las 14:34

Sugeriría reemplazar:

$scope.Bars = service.Bars;

Con algo como:

service.Bars.get().$promise.then( 
    function (data) {
        $scope.Bars = data;
    }
);

Para establecer solo la variable de alcance cuando tiene datos de su recurso ...

0
StuR 3 sep. 2014 a las 14:10