我試圖將應用程序從純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