AngularJS Fabrik-Eigenschaft wird nicht aktualisiert, $Umfang, wenn Sie nicht mit push()
Ich habe eine Fabrik, die das abrufen der Daten aus einer externen Quelle. Sobald ich die Daten habe, verwende ich eine zweite Fabrik zu filtern, indem die bestimmte Kriterien erfüllen.
Den Fabrik-Eigenschaft zugewiesen ist, um den Anwendungsbereich.
Nun, wenn ich das in meiner Fabrik, ist es nicht update-Umfang:
factory.foo = [{id:1,name:'foo'}]; //doesn't work
dafür auch die filterin in eine zweite Fabrik funktioniert nicht
factory.foo = Filter.filter(); //doesn't work
während das funktioniert:
factory.foo.push({id:1,name:'foo'}); //works
Hat jemand eine Ahnung ob das beabsichtigt ist und warum das so ist, und wie es zu lösen?
Vollständige Probe plus plunkr
app.factory('Foo',function(Filter) {
var factory = {
foo:[],
getDataForFoo:function() {
factory.foo = Filter.filter(); //doesn't work
//factory.foo = [{id:1,name:'foo'},{id:1,name:'foo'}]; //doesn't work
//factory.foo.push({id:1,name:'foo'}); //works
}
};
return factory;
});
app.factory('Filter',function() {
var factory = {
filter:function() {
var arr = [];
arr.push({id:1,name:'foo'});
return arr;
}
}
return factory;
});
app.controller('MainCtrl', function($scope,Foo) {
$scope.test = 'running';
$scope.foo = Foo.foo;
$scope.click = Foo.getDataForFoo;
});
- Ist das, was Simon Belanger sagt, Sie verlieren den Bezug. Ich erkläre es hier: angular-tips.com/blog/2013/08/consuming-services
- Für eine vollständige Erklärung der Umfang der Vererbung, Lesen Sie diese Antwort stackoverflow.com/questions/14049480/...
- ich glaube nicht, dass es um den Umfang der Vererbung, da ich nur einen Bereich hier.
- pardon, ich habe die Waffe sprang wie ich habe ein ähnliches problem, aber mit Rahmen früher!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass Ihre Fabrik ersetzen Sie den Verweis auf
Factory.foo
. Wenn Ihr Inhalt und Umfang ist initialisiert,$scope.foo
hält eine Referenz auf ein array (leer). Wenn Sie anrufenFoo.getDataForFoo
es intern ändert sich der Verweis aufFactory.foo
aber Ihr Umfang immer noch eine Referenz auf das Vorherige array. Deshalb ist die Verwendungpush
funktioniert, wie es nicht ändern, dass die array-Referenz, aber der array-Inhalt.Gibt es ein paar Möglichkeiten, um dieses Problem zu beheben. Ohne sich in all die verschiedenen Möglichkeiten, die einfachste ist, um wickeln Sie Ihre
$scope.foo
in einer Funktion zurückgebenFactory.foo
. Dieser Weg -, Winkel erkennt einen Verweis ändern in einen digest-Zyklus und aktualisiert die Ansicht entsprechend.Foo.foo
ist eine Funktion, die die Rückgabe eines Arrays), aber Sie wird immer noch zu nutzenfoo()
in Ihrer Vorlage. Eine weitere option ist das re-fetchFoo.foo
nach einem AufrufgetDataForFoo
wie:$scope.click = function() { Foo.getDataForFoo(); $scope.foo = Foo.foo; };
. An diesem Punkt, es ist wirklich eine Sache der Vorliebe, ob Sie gerne mit berechneten Eigenschaften (Funktion) oder nicht.@Simon-Belanger Antwort richtig ist, und er stellt eine praktikable Lösung.
Eine andere option wäre, leeren Sie einfach das array und drücken Sie neue Objekte (z.B. für eine Aktualisierung-Ereignis), anstatt rücksetzen der Referenz durch Zuweisung ein neues array zu. Sie können truncate ein array durch die Zuweisung an die Länge:
myArray.length = 0
und dann kann man iterieren über die neue Kollektion zu füllen, neue Einträge überarray.push()