AngularJS : 팩토리 $ http.get JSON 파일
하드 코딩 된 JSON 파일 만 사용하여 로컬로 개발하려고합니다. 내 JSON 파일은 다음과 같습니다 (JSON 유효성 검사기에 넣을 때 유효 함).
{
"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" }
]
}
]
}
JSON이 공장 내부에서 하드 코딩되었을 때 컨트롤러, 공장 및 html이 작동하게되었습니다. 그러나 이제 JSON을 $ http.get 코드로 바 꾸었으므로 작동하지 않습니다. $ http와 $ resource의 다양한 예를 많이 보았지만 어디로 가야할지 모르겠습니다. 가장 간단한 해결책을 찾고 있습니다. ng-repeat 및 유사한 지시문에 대한 데이터를 가져 오려고합니다.
공장:
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
});
모든 도움을 주시면 감사하겠습니다. 감사!
알겠습니다. 다음은 살펴볼 항목 목록입니다.
1) 어떤 종류의 웹 서버도 실행하지 않고 file : //index.html로 테스트 만한다면 동일 출처 정책 문제가 발생할 수 있습니다. 보다:
https://code.google.com/archive/p/browsersec/wikis/Part2.wiki#Same-origin_policy
대부분의 브라우저는 로컬에서 호스팅되는 파일이 다른 로컬에서 호스팅되는 파일에 액세스하는 것을 허용하지 않습니다. Firefox는이를 허용하지만로드중인 파일이 html 파일 (또는 하위 폴더)과 동일한 폴더에 포함되어있는 경우에만 가능합니다.
2) $ http.get ()에서 반환 된 성공 함수는 이미 결과 개체를 분할합니다.
$http({method: 'GET', url: '/someUrl'}).success(function(data, status, headers, config) {
따라서 function (response)로 성공을 호출하고 response.data를 반환하는 것은 중복됩니다.
3) 성공 함수는 전달한 함수의 결과를 반환하지 않으므로 생각한대로 수행하지 않습니다.
var mainInfo = $http.get('content.json').success(function(response) {
return response.data;
});
이것은 당신이 의도 한 것에 더 가깝습니다.
var mainInfo = null;
$http.get('content.json').success(function(data) {
mainInfo = data;
});
4)하지만 정말로 원하는 것은 데이터가로드 될 때 채워질 속성이있는 객체에 대한 참조를 반환하는 것입니다.
theApp.factory('mainInfo', function($http) {
var obj = {content:null};
$http.get('content.json').success(function(data) {
// you can do some processing here
obj.content = data;
});
return obj;
});
mainInfo.content will start off null, and when the data loads, it will point at it.
Alternatively you can return the actual promise the $http.get returns and use that:
theApp.factory('mainInfo', function($http) {
return $http.get('content.json');
});
And then you can use the value asynchronously in calculations in a controller:
$scope.foo = "Hello World";
mainInfo.success(function(data) {
$scope.foo = "Hello "+data.contentItem[0].username;
});
I wanted to note that the fourth part of Accepted Answer is wrong .
theApp.factory('mainInfo', function($http) {
var obj = {content:null};
$http.get('content.json').success(function(data) {
// you can do some processing here
obj.content = data;
});
return obj;
});
The above code as @Karl Zilles wrote will fail because obj
will always be returned before it receives data (thus the value will always be null
) and this is because we are making an Asynchronous call.
The details of similar questions are discussed in this post
In Angular, use $promise
to deal with the fetched data when you want to make an asynchronous call.
The simplest version is
theApp.factory('mainInfo', function($http) {
return {
get: function(){
$http.get('content.json'); // this will return a promise to controller
}
});
// and in controller
mainInfo.get().then(function(response) {
$scope.foo = response.data.contentItem;
});
The reason I don't use success
and error
is I just found out from the doc, these two methods are deprecated.
The
$http
legacy promise methods success and error have been deprecated. Use the standardthen
method instead.
this answer helped me out a lot and pointed me in the right direction but what worked for me, and hopefully others, is:
menuApp.controller("dynamicMenuController", function($scope, $http) {
$scope.appetizers= [];
$http.get('config/menu.json').success(function(data) {
console.log("success!");
$scope.appetizers = data.appetizers;
console.log(data.appetizers);
});
});
I have approximately these problem. I need debug AngularJs application from Visual Studio 2013.
By default IIS Express restricted access to local files (like json).
But, first: JSON have JavaScript syntax.
Second: javascript files is allowed.
So:
rename JSON to JS (
data.json->data.js
).correct load command (
$http.get('App/data.js').success(function (data) {...
load script data.js to page (
<script src="App/data.js"></script>
)
Next use loaded data an usual manner. It is just workaround, of course.
++ This worked for me. It's vanilla javascirpt
and good for use cases such as de-cluttering when testing with ngMocks
library:
<!-- specRunner.html - keep this at the top of your <script> asset loading so that it is available readily -->
<!-- Frienly tip - have all JSON files in a json-data folder for keeping things organized-->
<script src="json-data/findByIdResults.js" charset="utf-8"></script>
<script src="json-data/movieResults.js" charset="utf-8"></script>
This is your javascript
file that contains the JSON
data
// json-data/JSONFindByIdResults.js
var JSONFindByIdResults = {
"Title": "Star Wars",
"Year": "1983",
"Rated": "N/A",
"Released": "01 May 1983",
"Runtime": "N/A",
"Genre": "Action, Adventure, Sci-Fi",
"Director": "N/A",
"Writer": "N/A",
"Actors": "Harrison Ford, Alec Guinness, Mark Hamill, James Earl Jones",
"Plot": "N/A",
"Language": "English",
"Country": "USA",
"Awards": "N/A",
"Poster": "N/A",
"Metascore": "N/A",
"imdbRating": "7.9",
"imdbVotes": "342",
"imdbID": "tt0251413",
"Type": "game",
"Response": "True"
};
Finally, work with the JSON data anywhere in your code
// working with JSON data in code
var findByIdResults = window.JSONFindByIdResults;
Note:- This is great for testing and even karma.conf.js
accepts these files for running tests as seen below. Also, I recommend this only for de-cluttering data and testing/development
environment.
// extract from karma.conf.js
files: [
'json-data/JSONSearchResultHardcodedData.js',
'json-data/JSONFindByIdResults.js'
...
]
Hope this helps.
++ Built on top of this answer https://stackoverflow.com/a/24378510/4742733
UPDATE
An easier way that worked for me is just include a function
at the bottom of the code returning whatever JSON
.
// within test code
let movies = getMovieSearchJSON();
.....
...
...
....
// way down below in the code
function getMovieSearchJSON() {
return {
"Title": "Bri Squared",
"Year": "2011",
"Rated": "N/A",
"Released": "N/A",
"Runtime": "N/A",
"Genre": "Comedy",
"Director": "Joy Gohring",
"Writer": "Briana Lane",
"Actors": "Brianne Davis, Briana Lane, Jorge Garcia, Gabriel Tigerman",
"Plot": "N/A",
"Language": "English",
"Country": "USA",
"Awards": "N/A",
"Poster": "http://ia.media-imdb.com/images/M/MV5BMjEzNDUxMDI4OV5BMl5BanBnXkFtZTcwMjE2MzczNQ@@._V1_SX300.jpg",
"Metascore": "N/A",
"imdbRating": "8.2",
"imdbVotes": "5",
"imdbID": "tt1937109",
"Type": "movie",
"Response": "True"
}
}
참고URL : https://stackoverflow.com/questions/16930473/angularjs-factory-http-get-json-file
'Programing' 카테고리의 다른 글
CUDA가 내 gcc 버전과 호환되지 않습니다. (0) | 2020.09.17 |
---|---|
MAMP는 php.ini를 어디에 보관합니까? (0) | 2020.09.17 |
WebStorm : 검색이 작동하지 않습니다. (0) | 2020.09.17 |
SQL Server : 모든 대문자를 적절한 대소 문자 / 제목 대소 문자로 설정 (0) | 2020.09.17 |
C ++에서 시차를 계산하는 방법 (0) | 2020.09.17 |