无法访问JavaScript对象属性
我无法访问JavaScript对象的属性,即使该属性在那里。我正在尝试访问AngularJS中工厂对象的属性。代码如下:无法访问JavaScript对象属性,javascript,json,angularjs,Javascript,Json,Angularjs,我无法访问JavaScript对象的属性,即使该属性在那里。我正在尝试访问AngularJS中工厂对象的属性。代码如下: angular.module("appManager") // factories.js .factory("DataFactory", function ($http) { var fac = {}; fac.expenses = {}; $http.get("mvc/m/revenue.json") .success(f
angular.module("appManager")
// factories.js
.factory("DataFactory", function ($http) {
var fac = {};
fac.expenses = {};
$http.get("mvc/m/revenue.json")
.success(function (result) {
console.log(result); // line 9
fac.expenses = result.expenses;
});
console.log(fac); // line 13
return fac;
})
// expenseController.js
.controller("expenseCtrl", function($scope, DataFactory){
$scope.data = DataFactory.expenses;
console.log(DataFactory); // line 4
console.log(DataFactory.expenses); // line 5
console.log($scope.data); // line 6
// Global // var d = {};
d = DataFactory;
e = DataFactory.expenses;
});
以及控制台中的输出:
也有人问()这件事,但他没有得到解决办法。我还尝试了那里建议的方法:使用键,控制台抛出“undefined function”错误。您还可以注意到,$http
内的日志中的log()//9
的调用比其他函数晚;这是原因吗?但是请注意,log()//13
已经可以打印对象了
我认为AngularJS可能有问题,为了测试,我尝试了一些全局变量d和e
,它们也提供了相同的结果
我还尝试了下标:DataFactory[“expenses”]
,结果相同
有人能告诉我我做错了什么吗?您使用的是异步调用,但试图将它们视为同步发生。这根本不起作用,因为在请求结果的网络调用实际完成并返回之前,您最终尝试使用该结果 查看控制台语句的顺序。第13行(在
$http.get()
之后)调用发生在第9行之前(在$http.get()
的.success
处理程序中)。因此,在第13行,fac.expenses
还无法分配。甚至标有第4、5、6行的也发生在fac.expenses
设置在第9行之后
您似乎没有编写代码来处理异步网络调用,这就是它无法正常工作的原因。您只能从.success处理程序中可靠地使用fac.expenses
或从.success
处理程序调用的内容
此外,由于这是一个与时间相关的问题,调试工具可能会以多种方式愚弄您。通常,您应该记录正在查找的实际值,而不是父对象,因为console.log()
可能会在以后尝试钻取日志中的父对象时让您感到困惑(因为它已经被填充)
我并不完全了解您在这里想要实现的目标,也不知道应该推荐什么,但是如果您想使用fac.expenses
,然后您必须在最初返回它的.success
处理程序中使用它,或者您可以调用其他函数并将fac.expenses
传递给该其他函数。您不能像现在这样从异步回调返回它,并期望它在其他可能已执行的链接代码中可用。您使用的是异步调用,但尝试将它们当作同步发生一样处理。这根本不起作用,因为在请求结果的网络调用实际完成并返回之前,您最终尝试使用该结果
查看控制台语句的顺序。第13行(在$http.get()
之后)调用发生在第9行之前(在$http.get()
的.success
处理程序中)。因此,在第13行,fac.expenses
还无法分配。甚至标有第4、5、6行的也发生在fac.expenses
设置在第9行之后
您似乎没有编写代码来处理异步网络调用,这就是它无法正常工作的原因。您只能从.success处理程序中可靠地使用fac.expenses
或从.success
处理程序调用的内容
此外,由于这是一个与时间相关的问题,调试工具可能会以多种方式愚弄您。通常,您应该记录正在查找的实际值,而不是父对象,因为console.log()
可能会在以后尝试钻取日志中的父对象时让您感到困惑(因为它已经被填充)
我并不完全了解您在这里想要实现的目标,也不知道应该推荐什么,但是如果您想使用fac.expenses
,然后您必须在最初返回它的.success
处理程序中使用它,或者您可以调用其他函数并将fac.expenses
传递给该其他函数。您不能像现在这样从异步回调返回它,并期望它在其他可能已执行的链接代码中可用。您使用的是异步调用,但尝试将它们当作同步发生一样处理。这根本不起作用,因为在请求结果的网络调用实际完成并返回之前,您最终尝试使用该结果
查看控制台语句的顺序。第13行(在$http.get()
之后)调用发生在第9行之前(在$http.get()
的.success
处理程序中)。因此,在第13行,fac.expenses
还无法分配。甚至标有第4、5、6行的也发生在fac.expenses
设置在第9行之后
您似乎没有编写代码来处理异步网络调用,这就是它无法正常工作的原因。您只能从.success处理程序中可靠地使用fac.expenses
或从.success
处理程序调用的内容
此外,由于这是一个与时间相关的问题,调试工具可能会以多种方式愚弄您。通常,您应该记录正在查找的实际值,而不是父对象,因为console.log()
可能会在以后尝试钻取日志中的父对象时让您感到困惑(因为它已经被填充)
我并不完全了解您在这里想要实现的目标,以确切了解推荐的内容,但是如果您想使用fac.expenses
,那么您必须在内部使用它
.factory("dataFactory", ['$http', '$q', function ($http, $q) {
var fac = $q.defer();
$http.get("mvc/m/revenue.json")
.success(function (result) {
fac.resolve(result);
});
return fac.promise;
}]);
.controller("expenseCtrl", ['$scope', 'dataFactory', function($scope, dataFactory){
dataFatory.then(function(data) {
$scope.data = data.expenses;
});
}]);