우리 페이지의 레이아웃 세부 정보가 들어있는 일련의 json 파일 (page1.json, page2.json 등)이 있습니다.
지금까지 필자는 각 페이지의 데이터를 필요에 따라 모두로드했지만 모든 기능이 제대로 작동했지만 각도 앱이 시작될 때 모든 페이지의 페이지 데이터가 필요하다는 점은 분명합니다. 별도의 파일에 있어야합니다 (디자이너를 기쁘게하기 위해).
여기에 내가 노력했습니다 내용은 다음과 같습니다
var app = angular.module("templatesApp", ['bulletComponent', 'popupComponent', 'imageComponent', 'paragraphComponent', 'ngRoute']);
var numberOfPages = 0;
var pageData = [];
var pageIndex = 0;
/*Factory that runs http.get on content.json, used by multiple controllers */
app.factory('content', ['$http', 'completions', 'pages', function($http, completions, pages) {
var url = 'json/content.json';
return $http.get(url)
.success(function(data) {
// loop through pages and add corresponding page objects to completions.js service
for (var i=0; i<data.length; i++) {
completions.addPage(data[i].title);
numberOfPages += 1;
}
loadPageData(pages, completions);
return data;
})
.error(function(data) {
return data;
});
}]);
var loadPageData = function(pages, completions) {
console.log("loadPageData called when pageIndex = "+pageIndex);
pages.success(function(loadedData) {
pageData.push(loadedData);
completions.addPageComponents(pageIndex + 1, pageData[pageData.length-1]);
pageIndex += 1;
if (pageIndex < numberOfPages) {
loadPageData(pages, completions);
}
});
}
app.factory('pages', ['$http', function($http) {
console.log("pages factory called with pageIndex = "+pageIndex);
var url = 'json/page'+ (pageIndex + 1) +'.json';
return $http.get(url)
.success(function(loadedData) {
return loadedData;
})
.error(function(loadedData) {
return loadedData;
});
}]);
/*Controller for menu, data fetched from factory*/
app.controller('menuCtrl', ['$scope', '$http', 'content', function($scope, $http, content) {
content.success(function(data) {
$scope.pages = data;
});
}]);
/*Controller for individual pages. Makes XHR to json page for pages data.
Has function for calculating column widths*/
app.controller('pageCtrl', ['$scope', '$routeParams', '$http', 'content', 'completions', function($scope, $routeParams, $http, content, completions) {
$scope.page = pageData[$routeParams.pageId-1];
$scope.getStyle = function(singleCase, device) {
if (singleCase == undefined)
return '';
return assignBootstrap(singleCase, device);
}
$scope.pageId = $routeParams.pageId;
}]);
을 그래서 잘하면 당신이 볼 수 있으며, '내용'공장 '이 된 MenuCtrl'에 의해 불려갑니다. 먼저 content.json 파일 (페이지 제목 목록)을로드 한 다음 필요한 페이지마다 'pages'팩토리를 호출해야하는 재귀 함수 인 'loadPageData'를로드합니다.
문제는 console.logs가 'pages'팩터 리가 loadPatcher 함수조차도 한 번 호출된다는 것을 보여줍니다. 각 html 페이지는 동일한 (첫 번째) 데이터 집합을 전달합니다.
나는 '페이지'공장을 올바르게 사용하지 않는다고 가정하지만 정확한 옵션이 무엇인지 알지 못합니다.
누군가 포인터가 있다면, 나는 그들을 듣고 싶어합니다.
편집
의견을 보내 주셔서 감사합니다. 나는 내가 알아야 할 것이 무엇인지 깨달았다 고 생각한다 : 어떻게 일련의 약속 ($ http 호출)을 동적으로 설정 하는가? 페이지 수는 다양하므로 하드 코딩 할 수 없습니다.
$ q.all()을 사용하여로드를 동기화 할 수 있습니다. –
OK - 나는 그 용어의 인터넷 검색을 시작했으나 좀 더 자세하게 설명 할 수 있다면 기꺼이 들려 줄 것입니다. – moosefetcher
을 사용하면 작업 전에로드 할 약속 목록을 준비 할 수 있습니다. 화면이 시작되기 전에 여러 REST의 목록을로드하는 데 사용합니다. https://docs.angularjs.org/api/ng/service/$q –