Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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 在对象中循环时访问propertyname_Javascript_Angularjs_Rest_Iteration_Angularjs Ng Resource - Fatal编程技术网

Javascript 在对象中循环时访问propertyname

Javascript 在对象中循环时访问propertyname,javascript,angularjs,rest,iteration,angularjs-ng-resource,Javascript,Angularjs,Rest,Iteration,Angularjs Ng Resource,正如您在我在这个问题中提供的代码中所看到的,我尝试循环对象的属性。所有属性都是空对象!我还有另一个对象,我在其中存储了几个rest调用(ngResource的东西,对于这个问题来说并不重要) 在这里,您可以看到存储在$scope.restCalls中的“Rest调用” $scope.restCalls = [ { resource1: RestService.call1, resource2: RestService.call2, resource3: Res

正如您在我在这个问题中提供的代码中所看到的,我尝试循环对象的属性。所有属性都是空对象!我还有另一个对象,我在其中存储了几个rest调用(ngResource的东西,对于这个问题来说并不重要)

在这里,您可以看到存储在$scope.restCalls中的“Rest调用”

$scope.restCalls = [
   {
     resource1: RestService.call1,
     resource2: RestService.call2,
     resource3: RestService.call3
   },
   {
     resource4: RestService.call4,
     resource5: RestService.call5,
     resource6: RestService.call6
   },
   {
     resource7: RestService.call7,
     resource8: RestService.call8,
     resource9: RestService.call9
   }
];
$scope.data表示每个选项卡的数据。此数组中的每个对象都保存选项卡的数据。所有资源都初始化为空,如果用户更改页面,资源将存储在此处

$scope.data = [
   {
     resource1: {},
     resource2: {},
     resource3: {}
   },
   {
     resource4: {},
     resource5: {},
     resource6: {}
   },
   {
     resource4: {},
     resource5: {},
     resource6: {}
   }
];
到目前为止还不错。我保证电话正常工作。在我的应用程序中有多个选项卡,因此我想尝试实现一些延迟加载:D

因此,我实现了一个函数:(索引是在html中定义的,只是0和2之间的数字)

现在让我们来看问题描述:

  • 当我更改选项卡时,函数tabChange被触发
  • 每个Restcall都被正确触发
结果只会存储到错误的$scope.data[index]属性中。它始终是最后一个propertyname。例如,我改为tab2(索引1)。 $scope.data将以如下方式结束:

$scope.data = [
   {
     resource1: {},
     resource2: {},
     resource3: {}
   },
   {
     resource4: {},
     resource5: {},
     resource6: RESULT OBJECT OF THE LAST REST CALL!
   },
   {
     resource7: {},
     resource8: {},
     resource9: {}
   }
]; 

我认为propertynamethen函数中不可用。但是我不知道如何将名称输入到这个函数中

出现问题的原因是
propertyName
位于函数的上限范围内,并且在调用函数之前更改了其值。您可以将变量绑定到函数范围,如下所示

$scope.tabChange = function (index) {
        for (var propertyName in $scope.data[index]) {
            $scope.restCalls[index][propertyName]().$promise.then(function (propertyName,data) {
                $scope.data[index][propertyName] = data;
            }.bind(null,propertyName));
        }
    };

您可以从Google上了解有关javascript闭包和其他源代码的更多信息。

出现问题的原因是
propertyName
位于函数的上限范围内,并且在调用函数之前更改了它的值。您可以将变量绑定到函数范围,如下所示

$scope.tabChange = function (index) {
        for (var propertyName in $scope.data[index]) {
            $scope.restCalls[index][propertyName]().$promise.then(function (propertyName,data) {
                $scope.data[index][propertyName] = data;
            }.bind(null,propertyName));
        }
    };

您可以从谷歌上找到更多关于javascript闭包和其他源代码的信息。

很好用!谢谢,我不知道如何将变量绑定到then函数中。工作正常!谢天谢地,我不知道如何将变量绑定到then函数中。
$scope.tabChange = function (index) {
        for (var propertyName in $scope.data[index]) {
            $scope.restCalls[index][propertyName]().$promise.then(function (propertyName,data) {
                $scope.data[index][propertyName] = data;
            }.bind(null,propertyName));
        }
    };