2015-09-02 3 views
0

Я боролся с этим в течение нескольких дней и не могу найти решение. У меня есть простой список в моем представлении, извлеченный из MongoDB, и я хочу, чтобы он обновлялся всякий раз, когда я вызываю функцию удаления или обновления. Хотя кажется простым, что я должен иметь возможность вызывать ранее объявленную функцию в пределах одной области, она просто не работает.Функция определения области вызова AngularJS для модели области «refresh»

Я попытался установить getDispositivos на третьей службе, но затем Инъекция все испортилась. Объявление функции просто как var function() {...}, но это не работает.

Любая помощь приветствуется.

Вот мой код:

var myApp = angular.module('appDispositivos', []); 

    /* My service */ 
    myApp.service('dispositivosService', 
     ['$http', 
      function($http) { 
       //... 

      this.getDispositivos = function(response) { 
       $http.get('http://localhost:3000/dispositivos').then(response);  
      } 

      //... 
     } 
    ] 
); 

myApp.controller('dispositivoController', 
    ['$scope', 'dispositivosService', 
     function($scope, dispositivosService) { 

      //This fetches data from Mongo... 
      $scope.getDispositivos = function() { 
       dispositivosService.getDispositivos(function(response) { 
        $scope.dispositivos = response.data; 
       }); 
      }; 

      //... and on page load it fills in the list 
      $scope.getDispositivos(); 

      $scope.addDispositivo = function() { 
       dispositivosService.addDispositivo($scope.dispositivo); 
       $scope.getDispositivos(); //it should reload the view here... 
       $scope.dispositivo = ''; 
      }; 

      $scope.removeDispositivo = function (id) { 
       dispositivosService.removerDispositivo(id); 
       $scope.getDispositivos(); //... here 
      }; 

      $scope.editDispositivo = function (id) { 
       dispositivosService.editDispositivo(id); 
       $scope.getDispositivos(); //... and here. 
      }; 
     } 
    ] 
); 
+0

попробуйте вызвать $ scope.getDispositivos(); после получения ответа от add удалить или изменить –

ответ

0

На службе

this.getDispositivos = function(response) { 
      return $http.get('http://localhost:3000/dispositivos');  
     } 

на контроллер

$scope.addDispositivo = function() { 
      dispositivosService.addDispositivo($scope.dispositivo).then(function(){ 
      $scope.getDispositivos(); //it should reload the view here... 
      $scope.dispositivo = ''; 
    });  
}; 
0

Ни одно из решений не работал. Позже я обнаружил, что запрос GET выполняется, асинхронно. Это означает, что он загружает данные в $ scope до завершения запроса POST, таким образом, не включая только что включенные новые данные.

Решение состоит в том, чтобы синхронизировать задачи (несколько как в многопоточном программировании), используя модуль $ q, и работать с отложенными объектами и обещаниями. Так, на моей службе

.factory('dispositivosService', 
['$http', '$q', 
    function($http, $q) { 
     return { 
      getDispositivos: function (id) { 
       getDef = $q.defer(); 
       $http.get('http://myUrlAddress'+id) 
       .success(function(response){ 
        getDef.resolve(response); 
       }) 
       .error(function() { 
        getDef.reject('Failed GET request'); 
       }); 
       return getDef.promise; 
      } 
      } 
     } 
    } 
]) 

На мой контроллер:

$scope.addDispositivo = function() { 
      dispositivosService.addDispositivo($scope.dispositivo) 
      .then(function(){ 
       dispositivosService.getDispositivos() 
       .then(function(dispositivos){ 
        $scope.dispositivos = dispositivos; 
        $scope.dispositivo = ''; 
       }) 
      }); 
     }; 

Будучи мой «ответ» объект объект типа $ q.defer, то я могу сказать, Угловое, что ответ является асинхронным, и. затем (---), а затем (---). логика завершает задачи, по завершении асинхронных запросов.

Смежные вопросы