Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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
Angularjs 爱奥尼亚。从JSON文件中的数据返回工厂_Angularjs_Ionic Framework_Angular Http - Fatal编程技术网

Angularjs 爱奥尼亚。从JSON文件中的数据返回工厂

Angularjs 爱奥尼亚。从JSON文件中的数据返回工厂,angularjs,ionic-framework,angular-http,Angularjs,Ionic Framework,Angular Http,我正在使用Ionic示例项目,并且正在寻找一种从json文件中提取数据的方法,而不仅仅是项目中的标准数组 我已成功修改services.js以从JSON获取数据,但我的模板没有获取数据。我假设这是因为它在JSON的http请求完成之前执行 我需要做些什么才能让它工作 ........ .factory('People', function($http) { // Might use a resource here that returns a JSON array var people

我正在使用Ionic示例项目,并且正在寻找一种从json文件中提取数据的方法,而不仅仅是项目中的标准数组

我已成功修改services.js以从JSON获取数据,但我的模板没有获取数据。我假设这是因为它在JSON的http请求完成之前执行

我需要做些什么才能让它工作

........
.factory('People', function($http) {
  // Might use a resource here that returns a JSON array
  var people = $http.get('../data/peopleData.json').success(function(response){
    console.log(response.people); //the data is correctly logged
    return response.people;
  });

  // var people = [{
  //   id: 0,
  //   name: 'Kassiopi'
  // }, {
  //   id: 1,
  //   name: 'Imerola Bay'
  // }];
  //original and works great
return {
    all: function() {
      return people;
    },

    get: function(personId) {
      for (var i = 0; i < people.length; i++) {
        if (people[i].id === parseInt(people)) {
          return people[i];
        }
      }
      return null;
    }
  };

基本上,您希望从您的服务返回数据
Harbours
,并且您正在ajax上使用回调,并且试图从回调返回数据是当前代码中的主要威胁。 在您的工厂中,您需要返回有承诺的
$http.get
函数,当ajax完成时,它会调用
。然后
函数,该函数有
响应
,其中包含
数据
状态
标题
状态文本
。要访问数据,可以使用
response.data
&从服务返回数据

工厂

.factory('Harbours', function($http) {
  // Might use a resource here that returns a JSON array
  var people = return $http.get('../data/peopleData.json').then(function(response){
    data = response.data;
    console.log(data.people); //the data is correctly logged
    return data.people;

  });

  return {
     all: function() {
        return people;
     },
     //other code here
  };
});
您当前的代码具有
$scope.people=people.all()
只不过是分配
人员。all()
什么也不做这不是
承诺的
异步调用的工作方式。您需要执行以下步骤和代码以使代码正常工作

要从控制器访问数据,您需要再次使用
。然后在您的服务
人员
方法上使用
函数,该方法返回
承诺。基本上是控制器
。然后一旦数据丢失,就会调用
函数

控制器

app.controller('myCtrl', function(Harbours, $scope){
   //this will call people of Harbours service
   //.then function will get call once the people function, 
   //resolves its promise and return a data
   Harbours.all().then(function(data){ //success callback
       console.log(data); //you will have your data here.
       $scope.people = data;
   },function(error){ //error callback
       console.log(error);//error occurred here
   })
})

我建议您仔细阅读

基本上您希望从您的服务返回数据
Harbours
,并且您正在ajax上使用回调,试图从回调返回数据是您当前代码中的主要威胁。 在您的工厂中,您需要返回有承诺的
$http.get
函数,当ajax完成时,它会调用
。然后
函数,该函数有
响应
,其中包含
数据
状态
标题
状态文本
。要访问数据,可以使用
response.data
&从服务返回数据

工厂

.factory('Harbours', function($http) {
  // Might use a resource here that returns a JSON array
  var people = return $http.get('../data/peopleData.json').then(function(response){
    data = response.data;
    console.log(data.people); //the data is correctly logged
    return data.people;

  });

  return {
     all: function() {
        return people;
     },
     //other code here
  };
});
您当前的代码具有
$scope.people=people.all()
只不过是分配
人员。all()
什么也不做这不是
承诺的
异步调用的工作方式。您需要执行以下步骤和代码以使代码正常工作

要从控制器访问数据,您需要再次使用
。然后在您的服务
人员
方法上使用
函数,该方法返回
承诺。基本上是控制器
。然后一旦数据丢失,就会调用
函数

控制器

app.controller('myCtrl', function(Harbours, $scope){
   //this will call people of Harbours service
   //.then function will get call once the people function, 
   //resolves its promise and return a data
   Harbours.all().then(function(data){ //success callback
       console.log(data); //you will have your data here.
       $scope.people = data;
   },function(error){ //error callback
       console.log(error);//error occurred here
   })
})

我建议您仔细阅读您没有进入控制器,因为数据是在
$scope.people=people.all()之后提取的在这里进行异步调用时执行。因此,请使用defer from
$q
角度服务

.factory('People', function($http, $q) {
     var people = function () {
        var deffered = $q.defer();
        $http({
          method: 'GET',
          url: '../data/peopleData.json'
        }).success(function (data, status, headers, config) {
          deffered.resolve(data);
        }).error(function (data, status, headers, config) {
          deffered.reject(status);
        });

        return deffered.promise;
      };
以及工厂退货的变化

  return {
    all: people,
现在,
people
将在controller中返回您的承诺,您可以通过这种方式从中获取数据

 var peoplePromise =  People.all();
 peoplePromise.then(function(response){
  $scope.people = response; //assign data here to your $scope object
},function(error){
  console.log(error);
})

您没有进入控制器,因为数据是在
$scope.people=people.all()之后提取的在这里进行异步调用时执行。因此,请使用defer from
$q
角度服务

.factory('People', function($http, $q) {
     var people = function () {
        var deffered = $q.defer();
        $http({
          method: 'GET',
          url: '../data/peopleData.json'
        }).success(function (data, status, headers, config) {
          deffered.resolve(data);
        }).error(function (data, status, headers, config) {
          deffered.reject(status);
        });

        return deffered.promise;
      };
以及工厂退货的变化

  return {
    all: people,
现在,
people
将在controller中返回您的承诺,您可以通过这种方式从中获取数据

 var peoplePromise =  People.all();
 peoplePromise.then(function(response){
  $scope.people = response; //assign data here to your $scope object
},function(error){
  console.log(error);
})

请分享您在控制器中如何访问它?@mudasserajaz更新了我的帖子:)@Fraser查看过我的答案吗?请分享您在控制器中如何访问它?@mudasserajaz更新了我的帖子:)@Fraser查看过我的答案吗?
$http
确实返回了一个承诺。
$q.defer()
需要开销..?盲目地向控制器传递$http.get承诺有一个缺点,即控制器必须自己处理结果。当您希望服务对结果进行后期处理时,它会有所帮助。更重要的是要处理服务层中的$http错误,这样控制器就不需要处理重定向、404等,这可以通过使用承诺链接来完成。我认为不需要自定义承诺。@mudasserajaz感谢您花时间发表您的帖子,然而,这给了我“peoplePromise.then不是函数”@Fraser我很高兴它有帮助:)
$http
确实返回了一个承诺。
$q.defer()
需要开销吗?盲目地将$http.get promise传递给控制器有一个缺点,控制器必须自己处理结果。当您希望服务对结果进行后期处理时,它会有所帮助。更重要的是要处理服务层中的$http错误,这样控制器就不需要处理重定向、404等,这可以通过使用承诺链接来完成。我认为不需要自定义承诺。@mudasserajaz感谢您花时间发表您的帖子,然而,这给了我‘人民的承诺。那么这不是一个功能’@Fraser我很高兴它有帮助:)