我是角色的新手,并且在javascript中不太强大。我试图使用离子框架制作应用程序。我试图从json文件中获取列表。我已经成功地使用变量中的原始json。但我现在正尝试使用.service('staffServices', ['$q', '$http', staffService]);
function staffService($q, $http) {
var staffs = {};
var promise = $http.get("/js/jsons/settings.json")
.success(function(response) {
staffs = response.staffSettings;
console.log(staffs); //HAS WHAT I NEED
});
console.log(staffs); //EMPTY OBJECT
return {
loadAllSettings: function () {
return $q.when(staffs);
},
query: function (params) {
return filterFilter(staffs, params);
},
get: function (params) {
return this.query(params)[0];
}
}
};
从项目文件夹中的远程文件中检索它。
.success()
出于某种原因,我无法在self.settings
功能之外访问结果。我不确定这是因为我在javascript中的无知还是我在角度的新手状态。请帮帮我
这是我的控制器。永远不会填充.controller("staffCtrl", function (staffServices) {
var self = this;
self.settings = [];
staffServices.loadAllSettings()
.then(function (settings) {
self.settings = [].concat(settings);
console.log(settings);
});
});
并始终返回空对象
String storedDateString = "02-02-2015";
DateTimeFormatter format =
new DateTimeFormatterBuilder().appendPattern("MM-dd-yyyy").toFormatter();
Boolean isThreeDaysPassed =
LocalDate.now().minusDays(3).isAfter(LocalDate.parse(storedDateString, format));
答案 0 :(得分:1)
我认为问题在于你是如何处理$q和承诺的,你也可以试试这个:
// Removed irrelevant return functions temporarily
.service('staffServices', ['$q', '$http', staffService]);
function staffService($q, $http) {
var deferredPromise = $q.defer();
var staffs = {};
var promise = $http.get("/js/jsons/settings.json")
.success(function(response) {
staffs = response.staffSettings;
console.log(staffs);
deferredPromise.resolve(staffs);
})
.error(function(){
deferredPromise.reject();
console.log('Unsucessful json call');
});
return {
loadAllSettings: function () {
return deferredPromise.promise;
}
}
};
.controller("staffCtrl", function (staffServices) {
var self = this;
self.settings = [];
staffServices.loadAllSettings()
.then(function (settings) {
console.log(settings);
self.settings = [].concat(settings);
});
});
答案 1 :(得分:0)
$ http.get调用是异步的,所以当你在.success回调中调用console.log时,在$ http.get请求解决之前,该语句实际上并没有“发生”。
第二次调用console.log时,在.success语句之外,get请求尚未解析,因此人员仍然是开头的空变量。
如果这个答案对您没有意义,或者您不熟悉异步内容,我建议您查看this question,它可以很好地解释异步调用。
至于JSON没有正确返回,我相信$ q.when(来自loadAllSettings()函数)应该返回一个promise,当前它返回JSON对象staffSettings。要在返回的语句上使用.then调用,它需要是一个promise。尝试将人员设置为等于响应,然后检索控制器中的.staffSettings属性。
.controller("staffCtrl", function (staffService) {
var self = this;
self.settings = [];
staffService.loadAllSettings()
.then(function (settings) {
self.settings = [].concat(settings.staffSettings);
console.log(settings);
});
});