2016-04-25 131 views
0

正如您在本问题中提供的代码中所见,我尝试循环对象的属性。所有属性都是空的对象!我还有另一个对象,其中存储了一些其他的对象(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; 
      }); 
     } 
    }; 

现在让我们来问题描述:

  • 当我更改选项卡功能tabChange被解雇。
  • 每Restcall得到正确

发射结果只得到存入的$ scope.data [指数]错误的性质。它始终是最后一个属性名称。因此,例如我更改为tab2(索引1)。 $ scope.data最终会是这样的:

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

我认为PROPERTYNAME不可在然后运作。但我不知道如何让这个名字进入这个函数。

回答

2

问题出现是因为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和你可以从谷歌找到其他来源。

+0

工作正常!谢谢你不知道如何将变量绑定到**然后函数**中。 – walki12

相关问题