我的服务正在将数据返回给控制器,但我似乎无法像我期望的那样访问它。

时间:2016-10-14 21:08:51

标签: angularjs

(function () {
angular.module("app").controller('DashboardController', ['$q', 'dashboardService', function ($scope, $q,dashboardService) {
    var DashboardController = this;
    dashboardService.loadFromServer(DashboardController );
    console.log("DashboardController ", DashboardController);
}])
})();


angular.module("app").service('dashboardService', ['$http', '$q', function ($http, $q) {
return {
    loadFromServer: function (controller) {
        var getDashboardEntries = $http.get('http://someUrl');
        var getEmailData = $http.get('http://someOtherUrl');
        var getSidebarData = $http.get('http://yetAnotherUrl');

        return $q.all([getDashboardEntries, getSidebarData, getEmailData])
          .then(function (results) {
              controller.dashboardData = results[0].data;
              controller.chartData = results[1].data;
              controller.emailData = results[2].data;
          });
    },
};
}]);

1.该服务返回三位数据,这是使用以下方式记录的结果:

console.log("DashboardController ", DashboardController);

enter image description here

  1. 当我尝试以这种方式深入研究数据时,它会记录" undefined"

    console.log(" DashboardController" DashboardController.dashboardData); console.log(" DashboardController" DashboardController.chartData); console.log(" DashboardController" DashboardController.emailData);

1 个答案:

答案 0 :(得分:1)

您是否意识到在服务器有机会响应并承诺解析之前调用console.log后立即执行loadFromServer?实际订单是:

  1. loadFromServer
  2. console.log
  3. 承诺成功方法 - 实际拥有数据的地方
  4. 将您的控制器代码更改为:

    dashboardService.loadFromServer(DashboardController ).then(function() {
        console.log("DashboardController ", DashboardController);
    });
    

    更好的是从响应的部分构造一些对象并将其分配给控制器本身 - 而不是服务。在当前实现中,如果您想要另一个控制器,那么服务会将响应部分分配给相同的字段。我建议像这样:

    return $q.all([getDashboardEntries, getSidebarData, getEmailData])
          .then(function (results) {
              var data = {
                  dashboardData = results[0].data;
                  chartData = results[1].data;
                  emailData = results[2].data;
              };
    
              return data;
          });
    

    然后在控制器中:

    dashboardService.loadFromServer().then(function(data) {
        DashboardController.dashboardData = data.dashboardData;
        DashboardController.chartData = data.chartData;
        DashboardController.emailData = data.emailData;
    });
    

    在此解决方案中,控制器决定如何处理数据,而不是相反。