【问题标题】:Access propertyname while looping through an object [duplicate]循环访问对象时访问属性名[重复]
【发布时间】:2016-08-18 22:08:43
【问题描述】:

正如您在此问题中提供的代码中所见,我尝试循环遍历对象的属性。所有属性都是空对象!我还有另一个对象,我在其中存储了几个休息调用(ngResource Stuff,这对这个问题并不重要)。

在这里您可以看到存储在 $scope.restCalls 中的“Rest-Calls”。

$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之间的一个数字)

<uib-tab heading="Tab1" select="tabChange(0)">
... HERE I have some tables which access the $scope.data[0] data
</uib-tab>
<uib-tab heading="Tab2" select="tabChange(1)">
... HERE I have some tables which access the $scope.data[1] data
</uib-tab>
<uib-tab heading="Tab3" select="tabChange(2)">
... HERE I have some tables which access the $scope.data[2] data
</uib-tab>

这里可以看到功能:

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

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

  • 当我更改标签时,function tabChange 被触发。
  • 每个 Restcall 都会正确触发

结果只会存储到 $scope.data[index] 的错误属性中。它始终是最后一个属性名。因此,例如,我更改为 tab2(索引 1)。 $scope.data 会这样结束:

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

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

【问题讨论】:

    标签: javascript angularjs rest iteration angularjs-ng-resource


    【解决方案1】:

    出现问题是因为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 闭包 here 以及您可以从 Google 找到的其他资源。

    【讨论】:

    • 工作正常!谢谢 不知道如何将变量绑定到 then 函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2012-09-29
    • 2019-02-04
    • 1970-01-01
    • 2013-11-21
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多