将php响应存储在angularjs服务中,然后将它们放入控制器中
所以,我对angularjs是新手。我想使用MVC结构。所以,我想把来自php的响应存储在我的服务中,然后在我的控制器中使用它们 服务:将php响应存储在angularjs服务中,然后将它们放入控制器中,php,angularjs,angularjs-service,angularjs-controller,deferred,Php,Angularjs,Angularjs Service,Angularjs Controller,Deferred,所以,我对angularjs是新手。我想使用MVC结构。所以,我想把来自php的响应存储在我的服务中,然后在我的控制器中使用它们 服务: (function () { angular.module('dataService').service("incidentService", function ($http) { var Data = []; return ({ getData: __getData }); function __ge
(function () {
angular.module('dataService').service("incidentService", function ($http) {
var Data = [];
return ({
getData: __getData
});
function __getData() {
return Data;
}
function __setData($http, $q) {
var defer = $q.defer();
$http.get('PHP/NAME.php',{cache : 'true'}).
success(function(data){
Data = data;
console.log(Data);
defer.resolve(data);
defer.promise.then(function(data){
Data = data;
console.log(Data);
});
});
}
})})();
控制器:
(function () {
angular.module('app')
.controller('Ctrl', Ctrl);
/** @ngInject */
function Ctrl($scope, $http, $q,baConfig, incidentService) {
incidentService.setData($http,$q)
var DataSet = incidentService.getData();
console.log(DataSet);
}
})();
通过这种方式,问题是在更新我的服务中的数据数组时,我的数据集没有得到更新。我知道我们可以向控制器返回延迟承诺来获取数据,但是我们可以先在服务中设置数据,然后使用get方法来使用它们吗 好的,我认为这不起作用的最大问题是,您被分配了$http调用返回给nData的数据,而不仅仅是数据 下一个问题是服务上没有定义getMonthlyData方法 尽管如此,这看起来过于复杂 您的服务应该更像这样:
(function () {
angular.module('dataService').service("incidentService", function ($http,$q) {
var service
service.getData = __getData()
return service
function __getData() {
if (!service.Data) {
return $http.get('PHP/NAME.php',{cache : 'true'}).then( function(data) {
service.Data = data
return $q.when(service.Data)
})}
else {
return $q.when(service.Data)
}
}
})})();
然后在控制器中,您只需通过
incidentService.getData()
获取数据即可发布服务和控制器的完整定义。上面的代码中有一些基本的缺陷,最好能全部看到。另外,不确定您使用的Angular版本是什么,但success已被弃用。像下面一样使用。非常感谢。getMonthlyData()是一个输入错误。它应该是getData()。我还有一个问题。我应该如何存储在服务中获得的数据。我正在将其存储在data属性中。返回$q.when(service.Data)在后续调用中使用缓存数据。在这两种情况下,它都包装在一个承诺中,因此在控制器中,您可以使用incidentService.getData()。然后(…)引用它,或者在您知道必须调用该服务的实例中,您只需引用incidentService.data。谢谢。如果我想在我的服务中存储多个阵列,该怎么办?您基本上可以使用相同的方法,只需为每个阵列使用不同的属性名称,而不是我在.NVM上面使用数据的位置。我修好了。我想我有点明白你的意思。通过返回承诺,我们可以节省http调用的数量。您的服务变量用于检查我们是否进行http调用。