我试图将应用程序从纯JS转换为AngularJS,并且遇到了一个问题,我已经提取到下面的代码snipet中。angularJS在一个控制器中的http回调函数修改其他控制器的范围
我有两个控制器,每个调用一个SSE服务器,每个都有自己的回调函数。我的理解是每个控制器的$范围是不同的,修改一个不会影响另一个。
但是,只要eventBCtrl中的eventBCallBack()被执行,它就会影响eventACtrl的$ scope。我在eventACtrl中调用的过滤器在执行eventBCallBack()时执行。即使eventBCallBack()是一个空函数,也没有区别。
我怀疑它与$ scope。$ apply有关。
以下是HTML文件:
<!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>
以下是JavaScript代码:
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;
};
});
为什么不使用单个连接的事件而不是两个连接,例如活动,通过http://location.host/event?'EVENTA'和'EVENTB'? – 2015-04-02 14:30:20
其中一个事件以高频率重复(每秒10到100次)。另一个事件并不多,但更新了一个非常非常大的表格。每当高频事件发生时,我都无法承受大桌面事件的发生。无论如何,我现在已经明白了问题的根源。 $ scope。$ apply并不局限于控制器的范围。它在根范围内运作。我想我需要一些如何调用$摘要而不是$ apply来限制某个控制器的范围。问题是,$ digest目前似乎没有工作! – 2015-04-02 22:38:06
看来,这是因为你的服务器逻辑。虽然,考虑到[浏览器限制同时连接的数量],这是不期望的(但并不重要)(http://stackoverflow.com/questions/985431/max-parallel-http-connections-in-a-browser)。 – 2015-04-03 04:04:52