2016-04-25 144 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