2014-09-02 58 views
1

我们正在创建一个Telecom App仪表板。我们试图使用Logstash和Elastic搜索获取日志,并使用Angularjs的ng-Table指令在UI上显示它。在不同模块的控制器之间传递数据

我们能够获取日志,但问题是在两个不同模块的控制器之间发送响应。

下面是代码,

对于从弹性搜索检索日志:

// We define an EsConnector module that depends on the elasticsearch module.  

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

// Create the es service from the esFactory 
EsConnector.service('es', function (esFactory) { 
    return esFactory({ host: 'localhost:9200' }); 
}); 

// We define an Angular controller that returns the server health 
// Inputs: $scope and the 'es' service 

EsConnector.controller('ServerHealthController', function($scope, es) { 
es.cluster.health(function (err, resp) { 
     if (err) { 
     $scope.data = err.message; 
    } else { 
     $scope.data = resp; 
    } 
}); 
}); 
// We define an Angular controller that returns query results, 
// Inputs: $scope and the 'es' service 
EsConnector.controller('QueryController', function($scope, es) { 
// search for documents 
    es.search({ 
    index: 'logstash-2014.08.29', 
    size: 500, 
    body: { 
    "query": 
     { 
      "match": { 
       "CallId":-1   } 
     }, 
    }  
    }).then(function (response) { 
     $scope.hits = response.hits.hits; 
    }); 

}); 

我们需要通过数据,即从QueryController获得命中(的EsConnector模块)至MainController(表观的模块)

这里是应用程序模块: -

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

app.controller('MainController', function($scope, ngTableParams){ 
$scope.query = {} 
$scope.queryBy = '$' 
var data = ; \\ we want to populate 'data' with 'hits' of QueryController 
    $scope.tableParams = new ngTableParams({ 
     page: 1,   // show first page 
     count: 10   // count per page 
    }, { 
     total: data.length, // length of data 
     getData: function($defer, params) { 
     $defer.resolve(data.slice((params.page() - 1) * params.count(), params.page() * params.count())); 
    } 
}); 

});

另一种方法可能是合并两个模块。

谢谢。

回答

0

你可以在很多方面做到这一点,但最干净(松散耦合的方式)将是事件。如果这些模块加载在同一页面上,这意味着它们至少是$ rootScope的子项,并且您可以在$ rootScope上监听和引发事件来传达这些信息($ rootScope。$ on('myEvent',函数(data){}) - $ rootScope。$ emit('myEvent',{...})

更简洁的解决方案是使用某种数据管理器(AngularJS服务)存储这些信息并在多个地方获取,然后接收器控制器会监视这个service.getLogs()的响应,并且改变你将获得最新的数据(这在性能方面有点“硬核”,所以不推荐) 。

编辑:在ca如果需要在信息到达时显示特定的信息块,则可以使用空值(“$ scope.myModel.logs”)标记接收器控制器数据模型,并在应显示的块上添加ng-if条件这些日志与myModel.logs(何时将被接收的情况下,数据模型将被更新,块将被显示)

0

你可以结帐我先前的职位之一 -

http://stackoverflow.com/questions/25301581/angular-js-newbie-link-in-a-controller-view-that-triggers-another-controller-a/25305951#25305951 

我已经加入一个普拉克作为演示 - http://plnkr.co/edit/1dhdPfmB1WwAkYhsz4Hv

+0

这是一个模块内的两个控制器。如果我们想在两个模块之间传输数据会怎样? – 2014-09-02 09:09:09

相关问题