如何从angularjs同步调用json数据

时间:2015-09-30 10:51:57

标签: javascript json angularjs

我从AngularJS中的JSON文件调用一些数据,但由于异步调用,代码在接收数据之前转移到其他步骤,因此导致错误。 我使用了$http.get

$http.get('job.json').success(function (response) {
  $scope.big = response;      
});

你能建议一些同步方法来调用

的json数据吗?
{
  "days": [{
    "dayname": "Sun,23 Aug 2015",
    "date": "2015-08-23",
    "hours": "hoursArray(array24)"
  }, {
    "dayname": "Mon,24 Aug 2015",
    "date": "2015-08-24",
     "hours": "hoursArray(array24)"
  }, {
    "dayname": "Tue,25 Aug 2015",
    "date": "2015-08-25",
    "hours":"hoursArray(array24)"
  }, {
    "dayname": "Wed,26 Aug 2015",
    "date": "2015-08-26",
    "hours": "hoursArray(array24)"
  }]
}

这是我正在使用的jquery文件

(function($) {
	$.fn.schedule = function(options) {
		var methods = {
			init : function(ele, opt) {
				//methods.currentdate = methods.now.getFullYear() + "Engine Change" + methods.now.getMonth() + "Engine Change" + methods.now.getDate();
				methods.currentdate = methods.now.getFullYear() + "-" + methods.now.getMonth() + "-" + methods.now.getDate();
				// $("#scheduleAllDays > *").each(function(){
				// var item = $(this);
				// $("#scheduleAllDays").width($("#scheduleAllDays").width()+item.width());
				// });
				// $("#scheduleAllDays").width($("#scheduleAllDays").width());
				ele.find("[data-row]").each(function() {
					var drow = $(this), drowset = $("[data-row='" + drow.data("row") + "']");
					
					var maxheight = methods.elesMaxHeight(drowset);
					drowset.height(maxheight);
				});
				methods.allocateDurations(ele);
				$("#scheduleContentInner", ele).css("min-height", $(".schedule-drag-wrap", ele).innerHeight());
			},
			elesMaxHeight : function(ele) {
				var heights = $(ele).map(function() {
					return $(this).height();
				}).get();
				return Math.max.apply(null, heights);
			},
			allocateDurations : function(ele) {
				methods.flightdata = {
					routes : {}
				};
				ele.find("[data-flight-row]").each(function(i, ival) {
					var flight = $(this);
					methods.flightdata.routes["row" + i] = [];
					flight.find("[data-flight-record]").each(function() {
						var currentFlight = $(this), flightrecord = methods.makeStringToObject(currentFlight.data("flight-record"));
						flightrecord.element = currentFlight;
						methods.flightdata.routes["row" + i].push(flightrecord);
					});
				});
				methods.positionSet(ele);
			},
			positionSet : function(ele) {
				var dayelement = $("#scheduleAllDays > *", ele);
				
				var totaldaywidth = $("#scheduleAllDays").width() + 30;
				
				var totaldays = dayelement.size();
				
				var totalSeconds = (((totaldays * 24) * 60) * 60);
				var perSecondsWidth = Number(totaldaywidth / totalSeconds);
				var divider = $(".schedule-h-divider");
				dayelement.each(function(i, ival) {
					var dayele = $(this), dividerele = divider.eq(i);
					dividerele.css({
						top : $("#scheduleAllDays").height(),
						left : dayele.offset().left - 104
					});
				});
				for (var i in methods.flightdata.routes) {
					var iobj = methods.flightdata.routes[i];
					for (var j in iobj) {
						var jobj = iobj[j];
						var duration = jobj.duration, width = Number(methods.hmtosec(duration, ".") * perSecondsWidth);
						var parent = jobj.element.parent();
						jobj.element.css({
							// position : "relative",
							width : width + "px",
							overflow : "hidden",
							"white-space" : "nowrap"
						}).parent().css({
							// width : width+"px",
							// overflow : "hidden"
							// position:"absolute",
							left : (j==0)?0:parent.prev().position().left+parent.prev().width()
						});
					}
				}
				methods.dragInit(ele);
			},
			setCurrentTimeMarker : function(ele) {
				var marker = $(".schedule-current-time-marker");
				var markerpills = $(".schedule-time-marker-pills");
				var dayelement = $("#scheduleAllDays > *", ele);
				var totaldaywidth = $("#scheduleAllDays").width() + 30;
				var totaldays = dayelement.size();
				var totalSeconds = (((totaldays * 24) * 60) * 60);
				var perSecondsWidth = Number(totaldaywidth / totalSeconds);
				var currentdate = new Date();
				var format = currentdate.getFullYear() + "Engine Change" + currentdate.getMonth() + "Engine Change" + currentdate.getDate();
				var currentdateele = $("#scheduleAllDays").find("[data-date='" + format + "']");
				var days = (currentdateele.index()), seconds = ((days * 24) * 60) * 60;
				seconds = seconds + methods.hmtosec(currentdate.getHours() + "." + currentdate.getMinutes(), ".");
				marker.stop().animate({
					top : $("#scheduleAllDays",ele).height()-53,
					left : (seconds * perSecondsWidth) - (marker.width() / 2)
				}, 1000, "swing");
				markerpills.html(currentdate.getHours() + ":" + currentdate.getMinutes());
				methods.markermove = setInterval(function() {
					currentdate = new Date();
					marker.css({
						left : marker.position().left + perSecondsWidth
					}, "fast", "swing");
					markerpills.html(methods.makezerodigit(currentdate.getHours()) + " : " + methods.makezerodigit(currentdate.getMinutes()));
					// methods.schedulemove(ele,perSecondsWidth);
				}, 1000);
			},
			schedulemove : function(ele,seconds) {
				var dragwrap = ele.find(".schedule-drag-wrap");
				var routewidth = $(".schedule-route:eq(0)").width() + $(".schedule-route:eq(1)").width();
				var maxleft = -(dragwrap.width() - ($(window).width() - routewidth));
				if (Math.abs(dragwrap.position().left) < Math.abs(maxleft)) {
					dragwrap.css({
						left : (dragwrap.position().left - (dragwrap.width)) + "px"
					});
				}
			},
			makezerodigit : function(digit) {
				return (String(digit).match(/^[0-9]$/)) ? "0" + digit : digit;
			},
			dragInit : function(ele) {
				var currentdaycol = $("[data-date='" + methods.currentdate + "']");
				ele.find(".schedule-drag-wrap").css({
					left : -(currentdaycol.position().left - 50) + "px"
				}).animate({
					left : -currentdaycol.position().left - 0 + "px"
				}, 1000, "swing", function() {
					methods.drag(ele);
					methods.setCurrentTimeMarker(ele);
				});
			},
			drag : function(ele) {
				methods.move = null;
				$(".schedule-drag-wrap", ele).on("mousedown", function(e) {
					var dragele = $(this), position = dragele.position();
					methods.move = {
						x : e.pageX,
						y : e.pageY,
						left : position.left
					};
				}).on("mouseup mouseleave", function(e) {
					var dragele = $(this);
					if (methods.move) {
						methods.move = null;
						dragele.removeClass("userselect-none cursor-move");
					}
				}).on("mousemove", function(e) {
					var dragele = $(this), position = dragele.position(), movedx, drag = true;
					if (methods.move) {
						methods.curmove = {
							x : e.pageX,
							y : e.pageY
						};
						var routewidth = $(".schedule-route:eq(0)").width() + $(".schedule-route:eq(1)").width();
						var maxleft = -(dragele.width() - ($(window).width() - routewidth));
						var xcondition = (methods.move.x > methods.curmove.x);
						dragele.addClass("userselect-none cursor-move");
						if (position.left <= maxleft && xcondition) {
							drag = false;
							dragele.css({
								left : maxleft
							});
						}
						if (position.left > -10 && !xcondition) {
							drag = false;
							dragele.css({
								left : 0
							});
						}
						if (drag) {
							//if direction right to left
							movedx = methods.move.left + (methods.curmove.x - methods.move.x);
							dragele.css({
								left : movedx
							});
						}
					}
				});
			},
			now : new Date(),
			currentdate : "",
			hmtosec : function(hours, identy) {
				var s = (hours.match(/\./)) ? hours.split(identy) : [hours, 0], h = s[0], m = s[1];
				h = (Number(h)) ? (h * 60) * 60 : 0;
				m = (m == 0) ? 0 : m * 60;
			
				return Number(h + m);
				
			},
			makeStringToObject : function(string) {
				var loc_string = String(string).split("|");
				var output = {};
				for (var i in loc_string) {
					var keyvalue = loc_string[i].split("~");
					output[keyvalue[0]] = keyvalue[1];
				}
				return output;
			}
		};
		return this.each(function() {
			methods.init($(this), $.extend({}, $.fn.schedule.setting, options));
		});
	};
	$.fn.schedule.setting = {};
})(jQuery);
这是我得到的错误 未捕获的TypeError:无法读取未定义的

的属性“left”

3 个答案:

答案 0 :(得分:0)

在服务中: var deferred = $q.defer(); $http.get('job.json') .success(function(response) { defer.resolve(response); }).error(function(error){ console.log(error); }) return deferred.promise;

在控制器中:

var p=<serviceCall>
p.then(function(s){
$scope.ans=s;
})

$ q用于获取同步响应。更多详细信息:https://docs.angularjs.org/api/ng/service/ $ q

答案 1 :(得分:0)

使用promise.then您可以更新您的价值。

    var promise=$http.get('job.json');
    promise.then(function(result){
                  $scope.big=response;
    });

替代方式

   function getObj(callback){
    $http.get('job.json').success(callback);;
   } 

  getObj(function(result){
   console.log(result)
   // add your jquery code
  })

答案 2 :(得分:0)

您无法执行同步HTTP请求,因为无法立即加载响应(在您的情况下是JSON文件)。但是,$http.get返回一个在请求完成时解析的promise。一旦JSON文件加载到承诺的then块内,您就应该做您想要做的所有事情。

$http.get('job.json').then(function (response) {
  $scope.big = response;
  // Do anything else you need to after JSON has been loaded.     
});