2014-04-03 182 views
0

我不知道怎樣來寫這一點,所以請多多包涵..從另一個範圍遍歷範圍內的對象?

在我的主控制器,我有一個包含了一堆嵌套的地理信息能與像這樣點符號遍歷一個大的對象。 ..

$scope.cData = //large object pulled in from service 

// In the view, I can call the entire object or traverse it to return JSON 
{{cData}} // Entire object 
{{cData.United_States}} // US Data only 
{{cData.United_States.Southwest}} // Southwest region only 
{{cData.United_States.Southwest.Texas}} // Texas state only 

在孩子控制器,我有一個是建立了一個UI一堆輸入的範圍。因此,取決於用戶所做的選擇,所有變量都被監視並連接到控制器範圍。基於什麼樣的用戶選擇,手錶的功能將改變「查詢」變量:

$scope.companyData = "United_States.Southwest"; // User chooses southwest 

因此問題是,如何才能讓companyData作爲參數傳遞到在視圖中CDATA對象?看它不正確的方法是這樣的:

{{$parent.cData + {{companyData}} }} 

換句話說,我想用companyData範圍變量來引用,其中穿越到CDATA範圍變量。

回答

4

我想利用alexsanford1提出的方法,您可以改善這種使用AngularJS功能:

注入$parse在你的控制器中,然後這個功能看起來像這樣:

$scope.getNestedProperty = function(obj, propertyExpr) { 
    return $parse(propertyExpr)(obj); 
} 
+0

不錯!這個解決方案更清潔:) – alexsanford1

+0

哇,這真是不可思議!非常感謝你! – sdawson26

+0

亞歷山大,有沒有一種簡單的方法來從這個函數的值總是更新範圍變量?例如, '$ scope.datavalues = getNestedProperty($ parent.cData,companyData)' 我想一個手錶功能或什麼可以做的伎倆?這樣,如果我使用{{datavalues}},它將像{{getNestedProperty(a,b)}}一樣更新。這有道理嗎? – sdawson26

3

我建議在做這個的範圍上定義一個函數。您將需要拆分點字符上的字符串並迭代訪問嵌套屬性。我認爲這不是一回事,但請查看this post以瞭解可行的功能。

它應該是這個樣子:

// Function taken from post referenced above 
$scope.getDescendantProp = function(obj, desc) { 
    var arr = desc.split("."); 
    while(arr.length && (obj = obj[arr.shift()])); 
    return obj; 
} 

而在HTML:

{{ getDescendantProp($parent.cData, companyData) }} 
+0

不要重新發明輪子。這個功能已經在AngularJS中實現。 –

+0

alexsanford1,這是很棒的輸入。謝謝! – sdawson26

+0

雖然實施效率不高,但這個想法很好。 –