0

我在控制器之间共享数据时遇到问题。AngularJS:如何使用服务来检索数据并在控制器之间共享?

我用2个独立的控制器创建了一个页面。一个带有搜索表单,另一个带有表格以显示搜索结果。

我已经创建了这两个独立的控制器来保持事物的清洁,并让每个控制器处理其各自的屏幕部分。因此,我将处理搜索的逻辑和检索结果的逻辑放入一个注入两个控制器的服务中。 服务的search()方法用结果设置数据属性,并将result属性设置为控制器内的$ scope属性。

我认为它是这样工作的,但它没有。数据被正确检索并设置为服务属性,但不会反映到控制器属性中。我在这里做错了什么或缺少什么?

任何帮助非常感谢!

代码:两个控制器之间http://jsfiddle.net/0a75uh34/3/

var app = angular.module('app', []); 

app.controller('searchController', [ 
    '$scope', 'searchService', 

function ($scope, searchService) { 
    $scope.search = {}; 
    $scope.data = searchService.data; 

    $scope.submit = function() { 
     searchService.search($scope.search); 
    } 
}]); 

app.controller('searchListController', [ 
    '$scope', 'searchService', 

function ($scope, searchService) { 
    $scope.data = searchService.data; 

    $scope.test = function() { 
     console.log($scope.firms.length); 
    } 
}]); 

app.factory('searchService', [ 
    '$http', 

function ($http) { 

    return { 
     data: [], 

     search: function (params) { 
      var this$ = this; 
      $http.post('/echo/json/', params) 
       .success(function (result) { 
       this$.data = result; 
      }) 
       .error(function() { 
       console.log('Oops...'); 
      }); 
     } 

    } 
}]); 
+0

你拨弄没有搜索数据,单击按钮不会发生任何事情。 – CrazyGeek 2014-11-21 12:45:04

+0

我遗漏了搜索实现,因为这不是问题。我更改了示例代码以返回一些虚拟数据:http://jsfiddle.net/ranthonissen/0a75uh34/5/ – ranthonissen 2014-11-21 12:56:26

回答

0

我设法使用$区间为这个示例显示了完成所需的行为:

var app = angular.module('plunker', []); 

app.factory('ServiceData', function(){ 
    return { 
    data: [1,2,3], 
    search: function() { 
     var this$ = this; 
     this$.data = [1,2,3,5,6,6,7,8,9,];} 
    }; 
}) 

app.controller('MainCtrl', function($scope, $interval, ServiceData) { 
    $interval(function() { 
    $scope.data_list_1 = ServiceData.data; 
    }, 100); 

    $scope.doSearch = function() { ServiceData.search();}; 
}); 

app.controller('SecondCtrl', function($scope, $interval, ServiceData){ 
    $interval(function() { 
    $scope.data_list_2 = ServiceData.data; 
    }, 100); 
}); 

Plunkr这里:http://plnkr.co/edit/A75rTb

0

共享数据的乐趣。 首先,您需要使用工厂/服务模式创建服务。

var app = angular.module('plunker', []); 

app.factory('ServiceData', function(){ 
    return {data:[1,2,3,5,6,6,7,8,9,9,0]}; 
}); 

比你可以在任何控制器注入此服务,无论你创建多少控制器!

app.controller('MainCtrl', function($scope, ServiceData) { 
    $scope.data = ServiceData.data; 
}); 

app.controller('SecondCtrl', function($scope, ServiceData){ 
    $scope.data = ServiceData.data; 
}); 

这里工作plunker

+0

我也有类似的工作,但我想从远程WebAPI服务中检索我的数据一个按钮不在页面加载时。在这个点击中,服务的搜索方法被执行并且数据属性被设置。我可以看到这一点,当我通过我的代码时,但searchService.data is'n反映到$ scope.data – ranthonissen 2014-11-21 13:44:08

+0

我已经改变你的plunkr模拟我的情况在这里:http://plnkr.co/edit/A75rTb?p = preview – ranthonissen 2014-11-21 13:58:36

+0

现在就来看看http://plnkr.co/edit/Yavd4f – CrazyGeek 2014-11-22 03:38:10

相关问题