2013-03-20 13 views
5

In un'app angularjs, sto tentando di utilizzare un servizio personalizzato per contenere i dati principali dell'app, "elementi". Tuttavia, vorrei caricare i dati nel servizio al caricamento iniziale della pagina, al fine di evitare una richiesta ajax separata al server per ottenerla. Quale sarebbe il modo più pulito di fare questo?AngularJS - Caricamento dei dati in un servizio al caricamento della pagina

Ecco un frammento del mio servizio per riferimento:

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

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

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

    return itemsService; 
}); 

E sul backend che sto usando node.js + expressjs + giada, quindi sarei iniettano i dati nella pagina utilizzando:

!{JSON.stringify(items)} 
+0

Possibile duplicato. Migliori risposte in originale - [Come eseguire il bootstrap dei dati così come sono stati recuperati da un servizio $ resource in Angular.js] (http://stackoverflow.com/questions/12451864/how-to-bootstrap-data-as-it- it-were-fetched-by-a-resource-service-in-angular-js) – EBarr

risposta

3

Inserisci i dati bootstrap dal server in una variabile JavaScript globale. Chiedere al servizio di assegnare items a tale variabile globale (o copiare i dati in items).

+0

questo era quello che stavo pensando, ma dove dovrebbe avvenire quell'assegnazione/copia all'interno del mio codice? Perché semplicemente facendolo all'interno della chiamata 'app.factory' per creare il servizio, sostituendo' items = [] 'con' items = window.bootstrappedData' (dove bootstrappedData è la variabile javascript globale) non sembra funzionare. –

+0

Vorrei mettere il compito/copia in cui hai provato. L'unica cosa che posso pensare è di verificare che il codice JavaScript che assegna i dati alla variabile globale 'bootstrappedData' sia in esecuzione prima di Angular. –

+0

risulta essere stato solo un piccolo errore da parte mia, il tag script in cui ho inserito i dati aveva il suo attributo type impostato su 'js/data' quindi non veniva eseguito come javascript. > _ < –

1

Che ne dite di qualcosa di simile:

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

questo presuppone tuoi items s ervice ha una funzione load (o qualcosa del genere) che fa funzionare Ajax con le risorse $ http o $.

+0

ma poi se sto solo chiamando la mia funzione 'load()', sto solo facendo una richiesta ajax per caricare i dati invece di usando l'array iniettato javascript in linea di 'items', o sto completamente fraintendendo la tua risposta? –

+0

Suppongo che una funzione "load" esegua una richiesta Ajax la cui funzione di successo assegnerebbe il nuovo set di dati alla variabile "items" in linea. Quindi "caricare" non restituisce nulla; il suo unico scopo è quello di ottenere dati nella matrice interna "items". – Jollymorphic

Problemi correlati