Aktualisierung eckig $scope-variable innerhalb der forEach-Schleife
Ich habe eine Recht umfangreiche filter - /facettierte Suche-Anwendung.
Daten geladen werden, über eine API, und dann auf der Seite angezeigt wird mit einem ng-repeat. Es gibt auch eine google-map-Instanz mit einem marker assoziiert mit jedem item. Also die Anwendung ist sehr anspruchsvoll in Bezug auf die Berechnung. Ich denke, ich könnte eine überlastung einige Kunden mit schwächeren Maschinen am Ende.
Genug, der hintergrund. Ich habe es so funktioniert, wie ich will. Nun ich bin auf der Suche nach performance-Gewinne und mehr effektive Möglichkeiten, um meine Ziele zu erreichen.
Nun versuche ich herauszufinden, ob es besser ist, zu aktualisieren, ein $scope-variable (ein array) in einer forEach-Schleife, oder update ein eigenes array und aktualisieren Sie dann die $scope-variable nach der Schleife?
So, in diesem
$scope.myArrayWithAllTheItems = [];
$scope.myArrayWithItemKeysToBeDisplayed = [];
$http({method: 'GET', url: '/MYAPIURL'}).success(function(data, status, headers, config) {
if (angular.isArray(data)) {
angular.forEach(data, function (item, key) {
/*
some prework on item object here
*/
//update scope variable with every forEach iteration
$scope.myArrayWithAllTheItems.push({
/*
BIG OBJECT WITH MY DATA
foo : bar,
etc...
*/
});
//I store keys of the items that will be displayed on the page at any one moment
//Changing filter controls will alter this array, not the big one containg all the data
$scope.myArrayWithItemKeysToBeDisplayed.push(key);
});
} else {
//display error...
}
}).error(function(data, status, headers, config) {
//display error...
});
gegen diese (ich habe die Kommentare entfernt und else-Zweige, aber andernfalls ist das bit ist identisch, außer für 2 private arrays):
$scope.myArrayWithAllTheItems = [];
$scope.myArrayWithItemKeysToBeDisplayed = [];
$http({method: 'GET', url: '/MYAPIURL'}).success(function(data, status, headers, config) {
if (angular.isArray(data)) {
//private array variables to be update during the loop
var _myArrayWithAllTheItems = [],
_myArrayWithItemKeysToBeDisplayed =[];
angular.forEach(data, function (item, key) {
_myArrayWithAllTheItems.push({
});
_myArrayWithItemKeysToBeDisplayed.push(key);
});
//now update $scope variables only after the loop
$scope.myArrayWithAllTheItems = _myArrayWithAllTheItems;
$scope.myArrayWithItemKeysToBeDisplayed = _myArrayWithItemKeysToBeDisplayed;
}
});
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist genau das gleiche!
Ändern ein $scope-variable nicht sofort zwingen, eine UI/DOM-rendering. Die eigentlichen Rendern wird nur auftreten, wenn winklige ist
$digest()
genannt wird.So, es sei denn, Sie zwingen einen
$digest()
irgendwo auf deiner forEach-stack, keine render wird auftreten, bis das Ende der Schleife, so dass beide Optionen (im wesentlichen) gleichwertig in Bezug auf Leistung.Überprüfen Sie diese Erklärung auf, wie data binding funktioniert auf AngularJS.
Die beste Möglichkeit wäre, eine Dritte. Im Idealfall würde Sie umgestalten http-Aufruf in einem Dienst, beheben Sie die Daten, und füllen Sie anschließend Ihre scope-Element. Best practice ist, dass Sie minimale Logik im controller. Optimieren Sie Ihren code, Sie würden etwas tun, wie unten in Ihre controller.