Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法访问JavaScript对象属性_Javascript_Json_Angularjs - Fatal编程技术网

无法访问JavaScript对象属性

无法访问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

我无法访问JavaScript对象的属性,即使该属性在那里。我正在尝试访问AngularJS中工厂对象的属性。代码如下:

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;
    });
 }]);