You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS问题:无法从Service获取数据

解决AngularJS控制器与服务的数据同步问题

我来帮你揪出问题根源,你的代码里有几个容易忽略的细节错误,直接导致了数据同步失效:

核心问题拆解

  • 大小写不匹配:服务里定义的是Current.Data(大写D),但控制器里你写的是Service.Current.data(小写d)——这就像找错了文件柜的抽屉,自然拿不到数据。
  • 异步操作的时机错误:Service.get_data()是异步方法(返回Promise),你在控制器里同步赋值$scope.Current.incidents,这时候异步请求还没完成,Current.Data还是初始的空数组,所以返回结果为空。
  • 作用域对象未初始化:你直接给$scope.Current.incidents赋值,但$scope.Current一开始没有被定义为对象,这会导致incidents无法被正确挂载到作用域上,视图根本看不到这个属性。

修复后的完整代码

修正后的Service

GDI_App.factory('Service', function($q) {
  var Current = {};
  Current.Data = []; // 保持命名大小写一致

  return {
    get_data: function() {
      var Fake_Data = [
        { "Data1": "123123", "Data2": "15437" },
        { "Data1": "432234", "Data2": "146" },
        { "Data1": "45654", "Data2": "3534" },
        { "Data1": "76587", "Data2": "78978" },
        { "Data1": "2342", "Data2": "5345878" },
        { "Data1": "178", "Data2": "34534" },
        { "Data1": "173838", "Data2": "354534" },
      ];
      return $q.when(Fake_Data)
        .then(function(data) {
          angular.copy(data, Current.Data);
          return Current.Data; // 可选:返回更新后的数据,方便控制器做后续处理
        });
    },
    current_data: function() {
      return Current.Data;
    },
    // 新增方法:暴露Current对象,让控制器直接绑定引用
    getCurrent: function() {
      return Current;
    }
  };
});

修正后的控制器

GDI_App.controller('Form_Controller', function ($scope, Service) {
  // 先初始化作用域上的Current对象
  $scope.Current = {};
  
  // 直接绑定Service里Current.Data的引用,异步更新后视图会自动同步
  $scope.Current.incidents = Service.getCurrent().Data;

  // 调用异步加载方法,确保数据被填充
  Service.get_data()
    .then(function(loadedData) {
      console.log('数据加载完成:', loadedData);
      // 这里可以添加数据加载完成后的业务逻辑
    })
    .catch(function(error) {
      console.error('数据加载失败:', error);
    });
});

额外小贴士

因为Current.Data是引用类型的数组,只要控制器绑定的是这个数组的引用,当服务里用angular.copy更新数组内容时,作用域里的$scope.Current.incidents会自动同步,视图也会实时更新。

如果你不想暴露整个Current对象,也可以直接绑定Service.current_data()返回的数组,效果是一样的:

$scope.Current.incidents = Service.current_data();

内容的提问来源于stack exchange,提问作者Daniel Ellison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:37:55