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
相关产品推荐
相关产品推荐

