I'm trying to convert an application from pure JS to AngularJS and have run into a problem that I've extracted into the following code snipet.
I have two controllers that each call an SSE server and each has its own callback function. My understanding is that $scope for each controller would be different and modifying one would not effect the other.
However, whenever eventBCallBack() in eventBCtrl is executed, it seems to effect $scope of eventACtrl. My filter which is being called in eventACtrl is executed whenever eventBCallBack() is executed. Even if eventBCallBack() is an empty function, it makes no difference.
I suspect it has something to do with $scope.$apply.
Following is the HTML file:
<!DOCTYPE html>
<html ng-app="testApp">
<body>
<div ng-controller="eventACtrl">
<div>{{day}}</div>
<lable for="filteredName">Filter:</label>
<input type="text" name="filteredName" ng-model="filteredName"/>
<table>
<tbody>
<tr ng-repeat="module in modules | matchFilter:filteredName | orderBy: 'name'">
<td>{{$index+1}}</td>
<td>{{module.name}}</td>
</tr>
</tbody>
</table>
</div>
<div ng-controller="eventBCtrl">
{{cpu}}
</div>
<script src="js/angular.min.js"></script>
<script src="js/chaos.js"></script>
</body>
</html>
Following is the javascript code:
var testApp = angular.module("testApp", []);
testApp.controller("eventACtrl", function($scope) {
var eventACallback = function(e) {
$scope.$apply(function() {
var pData = JSON.parse(e.data);
var sDate = new Date(Number(pData.date));
$scope.day = sDate.toDateString() + " " + sDate.toLocaleTimeString();
$scope.modules = pData.modules;
console.log("EVENTA");
});
}
var source = new EventSource("http://" + location.host +"/EVENTS:A");
source.addEventListener("EVENTA", eventACallback, false);
});
testApp.controller("eventBCtrl", function($scope) {
var eventBCallback = function(e) {
$scope.$apply(function() {
var pData = JSON.parse(e.data);
$scope.cpu = pData.cpu;
console.log("EVENTB");
});
}
var source = new EventSource("http://" + location.host + "/EVENTS:B");
source.addEventListener("EVENTB", eventBCallback, false);
});
testApp.filter("matchFilter", function() {
return function(modules, filteredName) {
console.log("filter: " + filteredName);
var newModules = [];
for (var i in modules) {
if (modules[i].name.search(filteredName) != -1) {
newModules.push(modules[i]);
} else
continue;
}
return newModules;
};
});