2017-10-19 4 views
1

J'ai besoin de mettre à jour un document en utilisant angular et mongodb.La promesse d'AngularJs n'est pas rafraîchissante après la mise à jour des données

La fonction de mise à jour ("vm.UpdateItem") fonctionne correctement.

Mon problème est de savoir comment actualiser la vue après la mise à jour. Pour ce faire, je clique sur un bouton et appelle une promesse dans "vm.UpdateItem()" pour mettre à jour le document. Lorsque la promesse revient, je peux vérifier que les données retournées ont été mises à jour. Ensuite, je recharge les données du serveur avec la fonction "loadFilaLists", mais les données ne sont pas mises à jour.

Si j'appuie sur CTRL-F5, la vue se recharge et affiche correctement les données qui viennent d'être mises à jour.

Je ne peux pas voir où est l'erreur, parce que, j'utilise le "puis" de la promesse correctement.

Y at-il un problème de minuterie dans un endroit.

Est-ce que ok met à jour un document mongodb et le relit immédiatement, ou y at-il des limites de "timeout" pour le faire?

De l'aide sera appréciée.

// balisage

<button class="btn btn-sm btn-success" ng-click="vm.UpdateItem()"> 
<span>Update Item</span> 
</button> 

// Service

angular.module("clinang").service('dataService', ['$http','config', function ($http,config) { 
     this.postFilas = function (cond) { 
      return $http.post(urlBase + '/filas/all', cond) 
     }; 

     this.getFilas = function (where) { 
      return $http.get(urlBase+'/filas',{params:{"where":where}}); 
     }; 

     this.getFila = function (id) { 
      return $http.get(urlBase + '/filas/' + id); 
     }; 
     this.insertFila = function (tipo) { 
      return $http.post(urlBase+'/filas', tipo); 
     }; 

     this.updateFila = function (tipo) { 
      return $http.post(urlBase + '/filas/' + tipo._id, tipo) 
     };   

     this.deleteFila = function (id) { 
      return $http.delete(urlBase+'/filas/' + id); 
     }; 
}]); 

// contrôleur

var postFilas=function(checked, di, df){ 
     var deferred=$q.defer() 
     var cond=checked?medId:undefined; 
     var obj={'profissional':cond, '$and':[ 
       {'datahora_ent':{'$gte':di}}, 
       {'datahora_ent':{'$lt': df}} 
      ] }; 
     dataService.postFilas(obj).then((response)=>{ 
      deferred.resolve(response.data) 
     }) 
     .catch((erro)=>{ 
      deferred.reject('erro') 
     }) 

     return deferred.promise 
    } 

var loadFilaLists=function(checked){ 
     var di=moment(vm.dateRange.date.startDate).clone().startOf('day').toDate(); 
     var df=moment(vm.dateRange.date.endDate).clone().endOf('day').toDate(); 
     postFilas(checked,di,df).then((data)=>{ 
      console.log('data2',data) //problem - data is showing old data, before the update 
     }) 
    } 

vm.UpdateItem=function(item){ 
      dataService.updateFila(item).then((response)=>{ //updated 
       console.log('data1',response.data) //data is updated and return ok 
       loadFilaLists(true); //trying refresh all data 
      } 
    } 
loadFilaLists(true) 
+0

Je pense que votre API post renvoie d'anciennes données du côté serveur. – Icycool

+0

Non, ce n'est pas le cas. Si je mets la fonction "loadFilaLists" dans un timeout $ (function() {loadFilaLists}, 1000) le problème est terminé. Pourquoi je ne peux pas mettre à jour un document et relire immédiatement le document qui vient d'être mis à jour? –

Répondre

0

Je pense, vous ne avez juste besoin d'ajouter $promise à votre service,

this.postFilas = function (cond) { 
    return $http.post(urlBase + '/filas/all', cond).$promise; 
}; 
+0

Désolé, mais $ http renvoie déjà une promesse. Si je mets la fonction "loadFilaLists" dans un timeout $ (function() {loadFilaLists}, 1000) le problème est terminé. Pourquoi je ne peux pas mettre à jour un document et le relire immédiatement? –

+0

Désolé, je viens de le résoudre. C'était un problème sur mon serveur distant –