AngularJS:在指令和外部控制器之间共享数据

时间:2013-09-23 14:26:15

标签: angularjs angularjs-directive angularjs-scope

基本上我有:

  • 指令,
  • 带有承诺的数据服务
  • 用于存储检索数据的共享服务
  • 只要指令在数据服务上调用数据请求,就应该更新控件。

以下相关摘要。

假设html inside指令gerSearkator包含一个按钮,单击该按钮时 执行指令链接中定义的getResults()函数。

它应该调用服务gerSearch,然后更新gerSearchResults服务 应该更新$scope内的ResultsController,然后将视图绑定到它。

但......为什么它不起作用?

指令

angular.module('ger.directives').directive('gerSearkator', ['$http', 'gerSearch',    
        'gerSearchResults',
function($http, search, searchResults) {
  return {
    restrict: 'A',
    scope: {
        ngModel: '='
    },
    replace: true,
    templateUrl: 'js/directives/searkator.html',
    link: function($scope, $element, $attrs) {
        $scope.src.getResults = function() {
            search.get($scope.src.params).then(
                // success
                function(data, status, headers, config) {
                    searchResults.resultsData = data;                       
                },
                // error
                function(data, status, headers, config) {
                    // manage error...
                }
            );
        };
    }
}
}]);

数据服务

 angular.module('ger.services').factory('gerSearch', ['$http', '$q', 'gerConfig',
 function($http, $q, config) {  
    return {
        // "params" is an object
        get: function(params) {
            var d = $q.defer();

            $http.get(config.searchResultsPath, {params: params})
                .success(function(data, status, headers, config) {  
                    d.resolve(data, status, headers, config);
                })
                .error(function(data, status, headers, config) {                
                    d.reject(data, status, headers, config);
                }
            );

            return d.promise;
        }
    };  
    }]);

共享服务

angular.module('ger.services').factory('gerSearchResults', function() { 
    return {
        resultsData: {}
    };  
});

控制更新

 angular.module('ger').controller('ResultsController', function($scope, gerSearchResults) { 
    $scope.searchResults = gerSearchResults.resultsData;    
 });

HTML

<div ng-app="ger">
<!-- search box-->
<div ger-searkator></div>

<!-- tabs -->
<div class="row" ng-controller="ResultsController">
    <div class="col-lg-12">
        <code>{{searchResults}}</code>
    </div>
</div>
</div>

到目前为止,我已经能够使用以下方法解决问题:

$scope.$on('searchDataUpdated', function() {
    $scope.searchResults = gerSearchResults.resultsData;
});

但......这是正确的方式吗?

我添加了一个plunker来更好地解释问题(删除使用$ scope。$ on('searchDataUpdated'... http://plnkr.co/edit/yorXy5SaAbAZKXRoo4vv?p=preview

基本上,当我点击按钮时,我想用检索到的数据填充表格。

2 个答案:

答案 0 :(得分:3)

只需将观察者放在服务变量上

angular.module('Gene').controller('ResultsController', function($scope, gerSearchResults) {

    $scope.searchResults = {};
    $scope.$watch(function(){
      return gerSearchResults.resultsData;
    },function(newvalue,oldvalue){
      if(newvalue===oldvalue)return;
      $scope.searchResults=newvalue;
    })
});

答案 1 :(得分:0)

不确定究竟是什么问题,但原因可能是您正在用新对象替换resultData的对象引用。

searchResults.resultsData = data;

你可以试试像

这样的东西
searchResults.resultsData.length=0;
angular.forEach(data,function(item){
    searchResults.resultsData.push(item);
});