2014-09-02 146 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

相關問題