2016-09-23 4 views
0

Ich habe ein Problem, Werte in meinem Dienst vom Controller zu bekommen. Mein Service sieht wie folgt aus:Eckiger Service, der den Wert nicht erwartungsgemäß freigibt

angular.module('someApp').factory('someSvc', SomeSvc); 

function SomeSvc($http) { 
    var colors = []; 
    function loadColors() { 
     return $http.get('SomeApi/GetColors') 
      .then(function (result) { 
       //colors = result.data.colors;//<-this doesn't work 
       //angular.copy(result.data.colors, colors);//<-this works 
      }); 
    } 
    return { 
     loadColors: loadColors, 
     colors: colors 
    }; 
} 

Dann mein Controller einen Anruf wie diese machen könnte:

someSvc.loadColors().then(function(){vm.colors = someSvc.colors;}); 

Also, wenn ich debuggen, wenn ich einen Haltepunkt in der Steuerung gesetzt, wo die Zuordnung vm. colors wird erstellt, die colors-Eigenschaft, die auf dem someService-Objekt verfügbar gemacht wird, hat nur ein leeres Array oder ein Array mit den erwarteten Werten, abhängig davon, welche der beiden auskommentierten Zeilen ich im Service verwende.

Wenn ich einen Haltepunkt in dem Dienst setze, wo die Zuordnung zu Farben vorgenommen wird, haben die variablen Farben immer die erwarteten Werte (z. B. ["rot", "gelb", "grün"] ist was zurückkommt vom http Anruf). So kann ich beobachten, wie der Controller den http-Aufruf auslöst, den Wert zurückschaut und den Farben im Dienst zugewiesen wird, aber dann sieht der Controller nur ein leeres Array, wenn ich diesen angular.copy-Aufruf nicht mache.

Auch interessant ist, wenn ich den Dienst der return-Anweisung zu sehen wie folgt zu ändern:

return { 
    loadColors: loadColors, 
    colors: function() {return colors;} 
}; 

und dann in der Steuerung sagen vm.colors = someSvc.colors(); dann, dass gerade fein wie gut funktioniert.

Warum ist das? Warum wird dieses Array nicht durchgelassen?

UPDATE: ich gefunden habe, dass anstelle die angular.copy() Linie, ich kann diese alternativ tun, und alles funktioniert wie erwartet:

for (var i = 0; i < result.data.colors.length; i++) { 
    colors[i] = result.data.colors[i]; 
} 

Es scheint zu sein, dass das Objekt ASSIGNING ist ein Problem, beim Modifizieren ist es in Ordnung? Warum das?

Antwort

1

Dies könnte für Sie arbeiten. Vermutung, es ist nur ein Zeiger Problem vielleicht?

angular.module('someApp') 

.factory('someSvc', function($http) 
{ 
    return { 
    colors: [], 
    loadColors: function() 
    { 
     var self = this; 

     return $http.get('SomeApi/GetColors').then(function (result) 
     { 
     self.colors = result.data.colors; 
     }); 
    } 
    }; 
}); 
+0

Das funktioniert, aber ich verstehe nicht warum. – ctb

+0

Der Schlüssel ist var self = this; - Es stellt sicher, dass Sie auf das richtige Farbobjekt zeigen, wenn die Daten zurückkommen. – gmustudent

+0

Ja, aber warum zeigt es nicht auf das richtige Objekt ohne diese Referenz? Und warum macht es einen Unterschied, ob ich eine Zuweisungsoperation mache oder die Referenz aktualisiere (wie bei den Optionen angular.copy() oder manual for loop)? – ctb

0

Zu der Zeit sind Sie return in Ihrem Werk anrufen, someSvc.colors ist nur die leere Array - und der Wert zurückgegeben wird. Da Angular Provider im Allgemeinen versuchen, nur einmal zu laufen, überprüft sie in der Zukunft someSvc.colors nicht erneut - gibt nur den Anfangswert zurück.

Wenn Sie es in eine Funktion einfügen, wird die Funktion jedes Mal ausgeführt, sodass der aktualisierte Wert abgerufen wird.

+0

Wenn das der Fall wäre, warum würde die andere Zeile es funktionieren lassen: 'angular.copy (...)' – ctb

Verwandte Themen