Friday, 25 July 2014

Monday, 14 July 2014

Thursday, 5 June 2014

Friday, 9 May 2014

Tuesday, 6 May 2014

AngularJS (promises): Compartilhar variável do service para o controller

Precisei de um caso aqui no trabalho, onde eu precisava fazer um service pra executar minhas regras de busca usando RESTful.

As minhas respostas sempre vem em promise, e por algum tempo eu fazia tudo pelo controller. Quanto tentei usar o $q, acabei ficando com um tipo de cache estranho e que até agora não entendi.

Achei essa solução.

var app = angular.module('shareSrvToCtrl', []);

// Service
app.service('mySrv', ['$http', function($http) {

    //o objeto que será compartilhado
    var objSrv = {
        items: []
    };

    return {
      objCtrl: objSrv, //passe o objeto pra lá - não use variáveis primitivas, se não, não atualiza
      get: function(url) {
          if (obj.items.length === 0){
              $http.get(url, {timeout: 30000})
                  .success(function(data, status, headers, config) {
                    //could extend instead of ovewritting
                    objSrv.items = data;
                  })
                  .error(function(data, status, headers, config) {
                      objSrv.items = {status: status};
                  });
          }
          return objSrv;
      },
      empty: function(){
          objSrv.items = [];
      }
    };
}]);

// Controller
app.controller('myCtrl', ['mySrv', '$scope', function( mySrv,$scope) {

    //mySrv.objCtrl ainda não foi inicializada
    //dessa maneira eu não preciso ficar usando o .then() YAY!!
    $scope.objCtrl = mySrv.objCtrl; 

    $scope.getTest = function(){
        mySrv.get('url.json');
    };
    $scope.addItem = function() {
        $scope.objCtrl.items.push({'title': 'Test ' + $scope.objCtrl.items.length});
    };
    $scope.delItem = function() {
        $scope.objCtrl.items.splice(0,1);
    };

}]);

O bom disso, como está comentado no código, é que não preciso mais ficar chamando o .then() toda hora que eu quiser recuperar um dado. 😉

Espero que isto me ajude no futuro. Se ajudar você também, beleza \o/