AngularJS:$ http从外部文件中获取Json

时间:2015-07-21 22:02:53

标签: javascript json angularjs variables

我是角色的新手,并且在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));

2 个答案:

答案 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);
  });
});