2016-01-20 38 views
-1

我有這樣的JSON例子:

$scope.channels = { 
    "ch1": { 
     id: "ch1", 
     data: {} 
    }, 
    "ch2": { 
     id: "ch2", 
     data: {} 
    } 
    }; 

QUE 1

如何更新data: {}部分與動態密鑰? 類似:

for (var c in $scope.channels) { 
    $http.get(JSON_PATH + c + '.json').then(function(res){ 
     // DOES NOT WORK 
     $scope.channels[c]["data"] = res.data; 

     // ALSO DOES NOT WORK 
     var section = $scope.channels[c]; 
      section.data = res.data; 
     $scope.channels[c] = section; 
    }); 
    } 

$scope.channels結果是,現在有一個新的部分所謂的「數據」,而不是關鍵==「CH1」(即)下是。

此外,崇高的文本3也給出了我不知道爲什麼一個警告? (這不是像我使用this或東西: 181 don't make functions within a loop

QUE 2

我解決了上述問題,通過實際創建外部函數和循環中調用它

所以我想知道爲什麼在Que1上面的代碼無法正常工作,而這樣做:

function load_data(id) { 
$http.get(JSON_PATH + c + '.json').then(function(res){ 
    var section = $scope.channels[c]; 
    var section.data = res.data; 

    $scope.channels[c] = section; // WORK 
    }); 
} 

for (var c in $scope.channels) { 
    load_data(c); 
} 
+0

Sublime給出了警告,因爲您應該在循環外的其他地方聲明您的函數,然後在循環內部,使用傳入參數(如循環索引)調用函數,如您在Que 2中演示的那樣。 –

+0

您是否嘗試過使用控制檯.log或調試程序逐步查看每個步驟中每個變量的值並比較它們? –

+0

是的,我有我需要在執行console.log數據......但角的範圍$收到不同的,因爲我不知道如何更新JSON,它不按預期工作 –

回答

1

在闕1 for循環繼續它的週期,而$ HTTP方法是asyncronously處理「C」瓦里能夠失去它的原始背景和價值。我相信一旦for循環完成就會被銷燬。

在闕2,「C」是現在「ID」,並已通過了作爲一個靜態值將繼續提供給函數閉包內東西不管asyncronous活動。該函數引用「c」並停止關心循環是否銷燬它。

這與函數閉包做的,將需要有個更好的理解來解釋它的細節。

你應該闕2變「C」到「ID」不過,你的函數裏面。另外,作爲半相關的一面,如果您要循環一系列$ http調用,您可能需要查看$ q.all文檔並閱讀如何在可以創建promise數組的地方檢測所有呼叫的解析度,而不僅僅是個別呼叫。它可能非常有用。

+0

關於#1 - 意義,關於#2 - 是它的一個複製粘貼錯誤在這裏,感謝您的提示 - 我會考慮的! –