2014-06-09 30 views
7

özel hizmet içi $ http isteği gerçekleştirme ve geri dönen veri aşağıdaki gibidir:angularjs: Ben açısal bir özel http hizmeti tanımladığınız

angular.module('myApp') 
    .factory('myhttpserv', function ($http) { 

    var url = "http://my.ip.address/" 

    var http = { 
     async: function (webService) { 
      var promise = $http.get(url + webService, { cache: true }).then(function (response) { 
      return response.data; 
     }); 
      return promise; 
     } 
    }; 
    return http; 
}); 

Ve şöyle benim denetleyicisi bu hizmeti erişebilirsiniz:

Ancak, şimdi, bu işlemi, statik bir url ile hizmetin içinde bulunan TÜMÜ olması ve yalnızca verileri döndürmesi için bu yöntemi kolaylaştırmam gerekiyor. Sadece şöyle denetleyicisi diyoruz böylece:

angular.module('myApp') 
    .controller('myCtrl', function ($scope, myhttpserv) { 

     console.log(myhttpserv.var1); 
     console.log(myhttpserv.var2); 
     etc... 

}); 

Ben bu işlevselliği elde etmek için hizmet çimdik gibi olamaz. Bunu yapmak için doğru yolu bilen var mı?

cevap

14

Seçenek 1 - Kullanım söz API

angular.module('myApp').factory('myhttpserv', function ($http) { 
    return $http.get('http://my.ip.address/getUser?u=3', { cache: true }); 
}); 

Denetleyici:

angular.module('myApp').controller('myCtrl', function ($scope, myhttpserv) { 
    myhttpserv.then(function(response){ 
     console.log(response.data); 
    });  
}); 

Seçenek 2 - Kullanma rota çözmek

angular.module('myApp', ['ngRoute']).config(['$routeProvider', 
    function($routeProvider) { 
    $routeProvider. 
     when('/myCtrl', { 
     templateUrl: 'myView.html', 
     controller: 'myCtrl', 
     resolve: { 
     load: function (myhttpserv) { 
      return myhttpserv; 
     } 
     }); 
    }]); 

Hizmeti:

angular.module('myApp').factory('myhttpserv', function ($http) { 
     var data = {}; 
     var url = "http://my.ip.address/"; 
     var promise = $http.get(url + 'getUser?u=3', { cache: true }).then(function (response) { 
       data = response.data; 
      }); 
     return data; 
    }); 

Denetleyici:

angular.module('myApp') 
    .controller('myCtrl', function ($scope, myhttpserv) { 

     console.log(myhttpserv.data.var1); 
     console.log(myhttpserv.data.var1); 
     etc... 

}); 

Seçenek 3 - Kullanım $ aralığı hizmeti

angular.module('myApp').factory('myhttpserv', function ($http) { 
    var data = {}; 
    var url = "http://my.ip.address/"; 
    var promise = $http.get(url + 'getUser?u=3', { cache: true }).then(function (response) { 
      data = response.data; 
     }); 
    return data; 
}); 

Denetleyici:

angular.module('myApp').controller('myCtrl', function ($scope, $interval, myhttpserv) { 
     $scope.intervalPromise = $interval(function(){ 
      if (Object.keys(myhttpserv.data).length!=0) 
      { 
       console.log(myhttpserv.data); 
       $interval.cancel($scope.intervalPromise); 
      } 
     }, 100);  
}); 
+0

Bu yüzden, http çağrısı bittiğinde bir nesneyi iade etmek için hizmete erişemiyorum ve denetleyiciden bir satıra bu nesneye erişemiyorum? – AzzyDude

+0

Promise.then'i kullanmanız veya ajax çağrısının ne zaman döneceğini bilmediğimiz için bunun için bir aralık kullanmanız gerekir. Köşeli yönlendirici kullanırsanız, yönlendirmenin gerçekleşmesini ve denetleyicinizin yalnızca belirtilen vaatler (ajax istekleri) çözüldüğünde yüklenmesini de yapılandırabilirsiniz –

+0

'promise.then' yanıtınıza entegre edilebilir, böylece denetleyici yalnızca yalnızca istek çözüldü mü? – AzzyDude