2013-03-20 4 views
5

In einer AngularJs-App versuche ich, einen benutzerdefinierten Dienst zu verwenden, um die Hauptdaten der App "Elemente" zu halten. Allerdings möchte ich die Daten beim ersten Laden der Seite in den Dienst laden, um eine separate Ajax-Anfrage an den Server zu vermeiden. Was wäre der sauberste Weg, dies zu tun?AngularJS - Bootstrapping von Daten in einen Dienst beim Laden der Seite

Hier ist ein Ausschnitt aus meinem Dienst als Referenz:

app.factory('items', function() { 
    var itemsService = {}, 
     items = []; 

    itemsService.list = function() { 
     return items; 
    }; 

    itemsService.add = function() { 
     /* ... */ 
    }; 

    return itemsService; 
}); 

Und auf dem Back-End Ich bin mit node.js + Express.js + Jade, so würde ich mit den Daten in der Seite wird die Injektion:

!{JSON.stringify(items)} 
+0

Mögliches Duplikat. Bessere Antworten im Original - [Wie man Daten so bootet, wie sie von einem $ Ressourcendienst in Angular.js geholt wurden] (http://stackoverflow.com/questions/12451864/how-to-bootstrap-data-as-it- es-wurde-geholt-by-a-resource-service-in-eckigen-js) – EBarr

Antwort

3

Legen Sie Ihre Bootstrapped-Daten vom Server in eine globale JavaScript-Variable. Bitten Sie Ihren Dienst, dieser globalen Variable items zuzuweisen (oder kopieren Sie die Daten in items).

+0

das war was ich dachte, aber wo sollte diese Zuordnung/Kopie in meinem Code auftreten? Da dies einfach im Aufruf 'app.factory' zum Erstellen des Dienstes ausgeführt wird, scheint 'items = []' durch 'items = window.bootstrappedData' zu ersetzen (wobei bootstrappedData die globale JavaScript-Variable ist). –

+0

Ich würde die Aufgabe/Kopie dort platzieren, wo Sie es versucht haben. Die einzige Sache, die ich überprüfen kann, ist sicherzustellen, dass der JavaScript-Code, der die Daten der globalen Variablen bootstrappedData zuweist, vor Angular ausgeführt wird. –

+0

stellt sich heraus, war nur ein kleiner Fehler meinerseits, das Skript-Tag, in dem ich die Daten platziert hatte sein Typ-Attribut auf 'js/data' gesetzt, so dass es nicht als Javascript ausgeführt wurde. > _ < –

1

Wie wäre es etwa so:

app.run(['items', function (items) { 
    items.load(); 
}]) 

dies Ihre items s setzt voraus, ervice hat eine load Funktion (oder so ähnlich), die das eigentliche Ajax arbeitet entweder mit $ http oder $ resource.

+0

aber wenn ich nur meine 'load()' Funktion aufrufen, mache ich immer noch nur diese Ajax-Anfrage, um die Daten statt zu laden Verwenden Sie das Inline-Javascript injiziert Array von 'Items', oder bin ich total falsch verstanden Ihre Antwort? –

+0

Ich gehe davon aus, dass eine "load" -Funktion eine Ajax-Anfrage ausführen würde, deren Erfolgsfunktion den neuen Datensatz der Inline-Variablen "items" zuordnen würde. Also "Laden" gibt nichts zurück; Der einzige Zweck besteht darin, Daten in Ihr internes "items" -Array zu bringen. – Jollymorphic

Verwandte Themen