Javascript 如何在AngularJS中构造服务以使数据可用
通过学习和测试AngularJS,我对如何构造一个服务以使某些控制器可以使用某些数据感到怀疑 我有一个JSON文件,我想从我的服务加载它,然后通过我的控制器使用这个服务来访问数据 现在,我的服务如下所示:Javascript 如何在AngularJS中构造服务以使数据可用,javascript,angularjs,angular-services,Javascript,Angularjs,Angular Services,通过学习和测试AngularJS,我对如何构造一个服务以使某些控制器可以使用某些数据感到怀疑 我有一个JSON文件,我想从我的服务加载它,然后通过我的控制器使用这个服务来访问数据 现在,我的服务如下所示: dashboardController.factory ('peopleRepository', function($http) { return { getAllPeople: function() { return $http.get("people.json");
dashboardController.factory ('peopleRepository', function($http) {
return {
getAllPeople: function() {
return $http.get("people.json");
}
}
});
dashboardController.controller ('genderCtrl', function ($scope, $rootScope, peopleRepository) {
$scope.males = 0;
$scope.females = 0;
$scope.people = peopleRepository.getAllPeople().success(function(users) {
console.log ("SUCCESS -< ", users);
});
});
简单明了。
然后在我的控制器中,我执行如下操作:
dashboardController.factory ('peopleRepository', function($http) {
return {
getAllPeople: function() {
return $http.get("people.json");
}
}
});
dashboardController.controller ('genderCtrl', function ($scope, $rootScope, peopleRepository) {
$scope.males = 0;
$scope.females = 0;
$scope.people = peopleRepository.getAllPeople().success(function(users) {
console.log ("SUCCESS -< ", users);
});
});
dashboardController.controller('genderCtrl',函数($scope,$rootScope,peopleRepository){
$scope.males=0;
$scope.females=0;
$scope.people=peopleRepository.getAllPeople().success(函数(用户)){
console.log(“成功-<”,用户);
});
});
…当然,一切都很好,一切正常。
但我很确定这不是正确的方法。我需要在几个控制器中访问这些数据,这意味着基本上文件将被反复加载,每次我都在等待成功事件加载内容。不太优雅。
对新手有什么建议/提示吗?创建一个
缓存
对象,将您的数据存储在服务中。第一个控制器将获取的数据保存到它。另一个请求数据的用户不会再次调用$http,而是从缓存对象获取数据
我猜您还必须使用例如$q来创建promise base函数来获取数据
此外,您还可以在$http angularjs服务中使用内置缓存。有关更多信息,请参阅。创建一个
缓存
对象以将数据存储在服务中。第一个控制器将获取的数据保存到它。另一个请求数据的用户不会再次调用$http,而是从缓存对象获取数据
我猜您还必须使用例如$q来创建promise base函数来获取数据
此外,您还可以在$http angularjs服务中使用内置缓存。有关更多信息,请参阅。您必须至少添加一个简单的缓存机制 下面是一个简单的例子:
dashboardController.factory ('peopleRepository', function($http, $q) {
var people;
return {
getAllPeople: function() {
if (!people) {
// endpoint value may be put in a constant
people = $http.get("people.json").then(function (result) {
return result;
});
// A generic error handling mechanism can also be used
}
return people;
}
}
});
您必须至少添加一个简单的缓存机制 下面是一个简单的例子:
dashboardController.factory ('peopleRepository', function($http, $q) {
var people;
return {
getAllPeople: function() {
if (!people) {
// endpoint value may be put in a constant
people = $http.get("people.json").then(function (result) {
return result;
});
// A generic error handling mechanism can also be used
}
return people;
}
}
});
您可以将应用程序结构为SPA
单页应用程序
(这允许您在首次加载后使用缓存服务)。-但是,如果您已将应用程序在不同的控制器上分离,则需要在需要时进行注入。(我忘了,但你也可以将服务缓存到你的应用程序中)你是如何构造你的应用程序的其余部分的?你可以将你的应用程序构造为SPA单页应用程序
(这允许你在第一次加载后使用缓存服务)。-但是,如果您已将应用程序在不同的控制器上分离,则需要在需要时进行注入。(我忘了,但您也可以将服务缓存到应用程序中)您是如何构造应用程序的其余部分的?在加载完成之前,您的解决方案不会返回一个空对象吗?它将始终返回一个承诺吗?在加载完成之前,您的解决方案不会返回一个空对象吗?它将始终返回一个承诺吗?您的方法听起来很合理,@Nowres在回答中提出的解决方案不是也一样吗?是的。我还建议使用然后中的第二个回调,如果.get不成功,将执行该回调:)你的方法听起来很合理,@Nowres在回答中建议的解决方案不是也是这样吗?是的。我还建议在中使用第二个回调,然后在.get不成功时执行该回调:)