Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在AngularJS中构造服务以使数据可用_Javascript_Angularjs_Angular Services - Fatal编程技术网

Javascript 如何在AngularJS中构造服务以使数据可用

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");

通过学习和测试AngularJS,我对如何构造一个服务以使某些控制器可以使用某些数据感到怀疑

我有一个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不成功时执行该回调:)