Ich möchte lokal mit nur einer fest codierten JSON-Datei entwickeln. Meine JSON-Datei lautet wie folgt (gültig, wenn sie in den JSON-Validator gestellt wird):
{
"contentItem": [
{
"contentID" : "1",
"contentVideo" : "file.mov",
"contentThumbnail" : "url.jpg",
"contentRating" : "5",
"contentTitle" : "Guitar Lessons",
"username" : "Username",
"realname" : "Real name",
"contentTags" : [
{ "tag" : "Guitar"},
{ "tag" : "Intermediate"},
{ "tag" : "Chords"}
],
"contentAbout" : "Learn how to play guitar!",
"contentTime" : [
{ "" : "", "" : "", "" : "", "" : ""},
{ "" : "", "" : "", "" : "", "" : ""}
],
"series" :[
{ "seriesVideo" : "file.mov", "seriesThumbnail" : "url.jpg", "seriesTime" : "time", "seriesNumber" : "1", "seriesTitle" : "How to Play Guitar" },
{ "videoFile" : "file.mov", "seriesThumbnail" : "url.jpg", "seriesTime" : "time", "seriesNumber" : "2", "seriesTitle" : "How to Play Guitar" }
]
},{
"contentID" : "2",
"contentVideo" : "file.mov",
"contentThumbnail" : "url.jpg",
"contentRating" : "5",
"contentTitle" : "Guitar Lessons",
"username" : "Username",
"realname" : "Real name",
"contentTags" : [
{ "tag" : "Guitar"},
{ "tag" : "Intermediate"},
{ "tag" : "Chords"}
],
"contentAbout" : "Learn how to play guitar!",
"contentTime" : [
{ "" : "", "" : "", "" : "", "" : ""},
{ "" : "", "" : "", "" : "", "" : ""}
],
"series" :[
{ "seriesVideo" : "file.mov", "seriesThumbnail" : "url.jpg", "seriesTime" : "time", "seriesNumber" : "1", "seriesTitle" : "How to Play Guitar" },
{ "videoFile" : "file.mov", "seriesThumbnail" : "url.jpg", "seriesTime" : "time", "seriesNumber" : "2", "seriesTitle" : "How to Play Guitar" }
]
}
]
}
Ich habe meinen Controller, meine Factory und mein HTML zum Laufen gebracht, als der JSON in der Factory fest codiert wurde. Jetzt, da ich den JSON durch den Code $ http.get ersetzt habe, funktioniert er jedoch nicht mehr. Ich habe so viele verschiedene Beispiele für $ http und $ resource gesehen, bin mir aber nicht sicher, wohin ich gehen soll. Ich suche die einfachste Lösung. Ich versuche nur, Daten für ng-repeat und ähnliche Anweisungen abzurufen.
Fabrik:
theApp.factory('mainInfoFactory', function($http) {
var mainInfo = $http.get('content.json').success(function(response) {
return response.data;
});
var factory = {}; // define factory object
factory.getMainInfo = function() { // define method on factory object
return mainInfo; // returning data that was pulled in $http call
};
return factory; // returning factory to make it ready to be pulled by the controller
});
Jede Hilfe wird geschätzt. Vielen Dank!
Antworten:
Okay, hier ist eine Liste von Dingen, die Sie untersuchen sollten:
1) Wenn Sie keinen Webserver ausführen und nur mit der Datei //index.html testen, treten wahrscheinlich Probleme mit Richtlinien gleichen Ursprungs auf. Sehen:
https://code.google.com/archive/p/browsersec/wikis/Part2.wiki#Same-origin_policy
In vielen Browsern können lokal gehostete Dateien nicht auf andere lokal gehostete Dateien zugreifen. Firefox erlaubt dies jedoch nur, wenn sich die geladene Datei im selben Ordner befindet wie die HTML-Datei (oder ein Unterordner).
2) Die von $ http.get () zurückgegebene Erfolgsfunktion teilt das Ergebnisobjekt bereits für Sie auf:
Es ist also überflüssig, Erfolg mit Funktion (Antwort) aufzurufen und response.data zurückzugeben.
3) Die Erfolgsfunktion gibt nicht das Ergebnis der Funktion zurück, die Sie übergeben haben. Dies tut also nicht das, was Sie denken:
Dies ist näher an dem, was Sie beabsichtigt haben:
4) Was Sie aber wirklich tun möchten, ist, einen Verweis auf ein Objekt mit einer Eigenschaft zurückzugeben, die beim Laden der Daten ausgefüllt wird.
mainInfo.content startet mit null und zeigt beim Laden der Daten darauf.
Alternativ können Sie das tatsächliche Versprechen, das $ http.get zurückgibt, zurückgeben und Folgendes verwenden:
Und dann können Sie den Wert asynchron in Berechnungen in einer Steuerung verwenden:
quelle
Ich wollte darauf hinweisen, dass der vierte Teil von Accepted Answer falsch ist .
Der obige Code, wie er von @Karl Zilles geschrieben wurde, schlägt fehl, da er
obj
immer zurückgegeben wird, bevor er Daten empfängt (daher ist der Wert immernull
), und weil wir einen asynchronen Aufruf tätigen.Die Details ähnlicher Fragen werden in diesem Beitrag behandelt
Verwenden Sie
$promise
in Angular, um mit den abgerufenen Daten umzugehen, wenn Sie einen asynchronen Aufruf tätigen möchten.Die einfachste Version ist
Der Grund, den ich nicht benutze
success
und denerror
ich gerade aus dem Dokument herausgefunden habe , ist, dass diese beiden Methoden veraltet sind.quelle
return $http.get('content.json');
im Werk, andernfalls ist return null..success
ist jetzt veraltet. Verwenden Sie.then
stattdessen. docs.angularjs.org/api/ng/service/$httpDiese Antwort hat mir sehr geholfen und mich in die richtige Richtung gelenkt, aber was für mich und hoffentlich für andere funktioniert hat, ist:
quelle
Ich habe ungefähr dieses Problem. Ich muss die AngularJs-Anwendung aus Visual Studio 2013 debuggen.
Standardmäßig beschränkt IIS Express den Zugriff auf lokale Dateien (wie z. B. json).
Aber zuerst: JSON hat JavaScript-Syntax.
Zweitens: Javascript-Dateien sind zulässig.
So:
Benennen Sie JSON in JS (
data.json->data.js
) um.korrekter Ladebefehl (
$http.get('App/data.js').success(function (data) {...
Laden Sie das Skript data.js auf page (
<script src="App/data.js"></script>
)Verwenden Sie als nächstes die geladenen Daten auf übliche Weise. Es ist natürlich nur eine Problemumgehung.
quelle
++ Das hat bei mir funktioniert. Es ist
vanilla javascirpt
und gut für Anwendungsfälle wie das Aufräumen beim Testen mit derngMocks
Bibliothek:Dies ist Ihre
javascript
Datei, die dieJSON
Daten enthältSchließlich arbeiten Sie mit den JSON-Daten an einer beliebigen Stelle in Ihrem Code
Hinweis: - Dies ist ideal zum Testen und
karma.conf.js
akzeptiert diese Dateien sogar zum Ausführen von Tests (siehe unten). Außerdem empfehle ich dies nur, um Daten undtesting/development
Umgebung übersichtlicher zu gestalten .Hoffe das hilft.
++ Aufbauend auf dieser Antwort https://stackoverflow.com/a/24378510/4742733
AKTUALISIEREN
Eine einfachere Möglichkeit, die für mich funktioniert hat, besteht darin,
function
am Ende des Codes ein Zeichen einzufügen, das alles zurückgibtJSON
.quelle