Angularjs 爱奥尼亚。从JSON文件中的数据返回工厂
我正在使用Ionic示例项目,并且正在寻找一种从json文件中提取数据的方法,而不仅仅是项目中的标准数组 我已成功修改services.js以从JSON获取数据,但我的模板没有获取数据。我假设这是因为它在JSON的http请求完成之前执行 我需要做些什么才能让它工作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
........
.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我很高兴它有帮助:)