2017-10-12 9 views
0

Dans mon application Angular 1.5, je stocke souvent les données dans un objet ou un tableau afin de pouvoir les réutiliser dans un autre service.Comment puis-je réinitialiser les données dans mes services efficacement mémoire-sage - Angulaire?

(function() { 
     'use strict'; 

    angular 
     .module('myApp') 
     .factory('TemplateList', TemplateList); 

    function TemplateList() { 
     var templates = {}; 
    } 
})(); 

Il y a des fois où j'ai besoin d'effacer ces données et recommencer à zéro.

Je ne sais pas quelle technique de ces 3 sera le meilleur en termes de collecte des ordures et de l'efficacité:

  1. templates = {};

Affectez-le de nouveau à un objet vide.

  1. Object.assign (modèles, {}); Utilisez la nouvelle fonction ES6 pour l'affecter à un objet vide.

  2. angular.copy ({}, modèles) Utilisez le construit en fonction angulaire

En outre, s'il est un cas plus compliqué? Par exemple, j'ai des données par défaut, par ex.

var defaultData = { name: null, id: null }; 
templates = { name: 'hi', id: 5 } 

Si je le fais chaque fois templates = defaultData qui ne sera pas efficace. Laquelle des trois techniques est la meilleure dans ma situation?

+0

'templates = {}' Vous perdrez le lien avec votre mémoire, le GC le trouvera et supprimera les données dans votre mémoire. – sheplu

+0

Et si c'est un peu plus compliqué? Par exemple, j'ai des données par défaut, par exemple. var defaultData = {nom: null, id: null}; templates = {nom: 'hi', id: 5} Si je fais cela à chaque fois templates = defaultData qui ne sera pas bon non? – user1261710

+0

vous avez juste besoin de perdre la référence entre votre variable et la mémoire. Le GC utilisera ce que nous appelons «marquer et balayer» pour libérer votre mémoire. Vous trouverez plus de choses sur MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management – sheplu

Répondre

0

templates = {} est bien, performance-sage. Mais vous devez être conscient que vous créez un nouvel objet. Si l'un de vos contrôleurs ou d'autres services a une référence à l'ancien objet, il ne passera pas à garbage collector. Gardez l'analogie du ballon en tête. Un objet est un ballon et chaque variable qui fait référence à cet objet est une chaîne. Ce n'est que lorsque toutes les ficelles sont coupées que le ballon flotte (vers le ramasse-miettes).

Object.assign() et angular.copy() sont incorrects pour cette tâche car ils ne supprimeront pas les propriétés de l'objet de destination. Le scénario final templates = defaultData est également incorrect. Il semble que vous pensez qu'il va copier defaultData sur templates, en préservant l'objet defaultData. Ce n'est pas le cas. templates sera simplement une nouvelle référence au même objet auquel se réfère defaultData. Même ballon, juste maintenant deux cordes.

Ici, cependant, vous POUVEZ utiliser angular.copy().

templates = angular.copy({}, defaultData); 

qui copie les propriétés de defaultData sur un nouvel objet anonyme, qui est ensuite affecté à la variable templates.