Ich verwende einen Dienst, um Daten zwischen den Controllern zu teilen. Die Anwendung muss das DOM aktualisieren, wenn eine Variable geändert wird. Ich habe zwei Wege gefunden, das zu tun, Sie den Code sehen hier:
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();
};
}]);
Im ersten Fall teile ich eine Variable aus dem Service mit dem Controller und beobachten Sie es in der Direktive. Hier kann ich die Variable direkt in diesem Controller oder einem anderen Controller ändern, der sie gemeinsam nutzt, und das DOM wird aktualisiert.
In der anderen Option, ich benutze eine Funktion aus dem Dienst, um die Variable zu ändern, die ein Ereignis sendet. Dieses Ereignis wird vom Controller abgehört und das DOM wird aktualisiert.
Ich würde gerne wissen, welche Option besser ist und die Gründe dafür.
Danke.
EDIT:
Der Code in jsFiddle, ist eine vereinfachte Version des Real-Code, die mehrere Objekte und Funktionen. Im Dienst ist das Wertfeld von myVariable tatsächlich ein Objekt mit viel mehr Informationen als nur ein primitiver Typ; Diese Informationen müssen im DOM angezeigt und aktualisiert werden. Das Objekt myVariable.value wird in jeder Änderung einstellen:
myVariable.value = newValue;
Wenn das passiert alle DOM-Elemente aktualisiert werden müssen. Da die in myVariable.value enthaltenen Informationen variabel sind, ändert sich die Anzahl der Eigenschaften (ich kann kein Array verwenden), es ist viel einfacher, die DOM-Elemente zu löschen und neue zu erstellen, das mache ich in der Direktive (aber mit mehr Elementen im realen Code):
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>");
});
Danke, ich entschuldige mich, ich habe keine weiteren Details geben. Ich habe den Beitrag bearbeitet. – sosegon
Ich sehe immer noch nicht die Notwendigkeit, dom zu entfernen und hinzuzufügen. Aber wenn du so willst, dann sage ich '$ watch'. –