2013-03-20 15 views
5

W aplikacji angularjs próbuję użyć niestandardowej usługi do przechowywania głównych danych aplikacji, "elementów". Chciałbym jednak załadować dane do usługi po wczytaniu początkowej strony, aby uniknąć osobnego żądania ajax do serwera, aby je pobrać. Jaki byłby najczystszy sposób na zrobienie tego?AngularJS - Ładowanie danych do usługi przy ładowaniu strony

Oto fragment mojej służby dla odniesienia:

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

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

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

    return itemsService; 
}); 

I na backend Używam node.js + expressjs + jade, więc chciałbym być wstrzykiwanie dane na stronę przy użyciu:

!{JSON.stringify(items)} 
+0

Prawdopodobny duplikat. Lepsze odpowiedzi w oryginale - [Jak uruchomić dane startowe, ponieważ zostały pobrane przez usługę $ resource w Angular.js] (http://stackoverflow.com/questions/12451864/how-to-bootstrap-data-as-it- to-by-pobierane przez usługi-zasobów-w-kanciastym-js) – EBarr

Odpowiedz

3

Umieść swoje początkowe dane z serwera w globalnej zmiennej JavaScript. Niech twoja usługa przypisze items do tej zmiennej globalnej (lub skopiuj dane do items).

+0

to było to, o czym myślałem, ale gdzie powinno się to zająć/skopiować w moim kodzie? Ponieważ po prostu robi się to w ramach wywołania 'app.factory', aby utworzyć usługę, zastąpienie elementu' items = [] 'przez' items = window.bootstrappedData' (gdzie bootstrappedData jest globalną zmienną javascript) wydaje się nie działać. –

+0

Umieszczałbym zadanie/kopię tam, gdzie próbowałeś. Jedyne, co mogę sprawdzić, to upewnić się, że kod JavaScript, który przypisuje dane do zmiennej globalnej 'bootstrappedData', jest wykonywany przed Angular. –

+0

okazało się tylko małym błędem z mojej strony, tag skryptu, w którym umieściłem dane miał atrybut type ustawiony na 'js/data', więc nie był wykonywany jako javascript. > _ < –

1

Jak o coś takiego:

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

ta polega swoje items s ervice ma funkcję load (lub coś podobnego), która wykonuje rzeczywistą pracę w Ajaksie przy użyciu zasobu $ http lub $.

+0

ale wtedy, jeśli właśnie wywołuję moją funkcję 'load()', wciąż właśnie robię to żądanie ajax, aby załadować dane zamiast używając wbudowanej tablicy "rzeczy" wstrzykniętych w javascript, czy też całkowicie nie rozumiem twojej odpowiedzi? –

+0

Zakładam, że funkcja "load" wykonałaby żądanie Ajax, którego funkcja powodzenia przypisze nowy zbiór danych do zmiennej "item" inline. Tak więc "ładunek" niczego nie zwraca; jego jedynym celem jest pobranie danych do wewnętrznej tablicy "items". – Jollymorphic

Powiązane problemy