Sto utilizzando un servizio per condividere i dati tra i controller. L'applicazione deve aggiornare il DOM quando una variabile viene modificata. Ho trovato due modi per farlo, si può vedere il codice qui:
http://jsfiddle.net/sosegon/9x4N3/7/
myApp.controller("ctrl1", [ "$scope", "myService", function($scope, myService){
$scope.init = function(){
$scope.myVariable = myService.myVariable;
};
}]);
myApp.controller("ctrl2", [ "$scope", "myService", function($scope, myService){
$scope.increaseVal = function(){
var a = myService.myVariable.value;
myService.myVariable.value = a + 1;
};
}]);
http://jsfiddle.net/sosegon/Y93Wn/3/
myApp.controller("ctrl1", [ "$scope", "myService", function($scope, myService){
$scope.init = function(){
$scope.increasedCounter = 1;
$scope.myVariable = myService.myVariable;
};
$scope.$on("increased", function(){
$scope.increasedCounter += 1;
}
}]);
myApp.controller("ctrl2", [ "$scope", "myService", function($scope, myService){
$scope.increaseVal = function(){
myService.increaseVal();
};
}]);
Nel primo caso condivido una variabile dal servizio con il controller e $ la osservo nella direttiva. Qui, posso modificare la variabile direttamente in questo controller o in qualsiasi altro controller che la condivide e il DOM viene aggiornato.
Nell'altra opzione, utilizzo una funzione del servizio per modificare la variabile che $ trasmette un evento. L'evento viene ascoltato dal controller, quindi il DOM viene aggiornato.
Mi piacerebbe sapere quale opzione è migliore e le ragioni per questo.
Grazie.
EDIT:
Il codice in jsFiddle, è una versione semplificata del codice reale che ha più oggetti e funzioni. Nel servizio, il campo valore di myVariable è in realtà un oggetto con molte più informazioni di un semplice tipo primitivo; quell'informazione deve essere visualizzata e aggiornata nel DOM. Il myVariable.value oggetto viene impostato in ogni cambio:
myVariable.value = newValue;
Quando ciò accade tutti gli elementi DOM devono essere aggiornati. Poiché le informazioni contenute in myVariable.value sono variabili, il numero di proprietà cambia (non posso usare un array), è molto più facile eliminare gli elementi DOM e crearne di nuovi, questo è quello che sto facendo nella direttiva (ma con più elementi nel codice reale):
scope.$watch("myVariable.value", function(newVal, oldVal){
if(newVal === oldVal){
return;
}
while(element[0].children.length > 0){
element[0].removeChild(element[0].firstChild);
}
var e = angular.element(element);
e.append("<span>Value is: " + scope.myVariable.value + "</span>");
});
Grazie, mi scuso per non aver fornito ulteriori dettagli. Ho modificato il post. – sosegon
Ancora non vedo la necessità di rimuovere e aggiungere dom. Ma se vuoi in questo modo, io dico "$ watch" allora. –