2016-09-02 56 views
0

「連接」在角2個變量我有控制器2個變量:如何通過一些價值

$scope.first = [ 
    { id="11", nameF="aaaa1" }, 
    { id="12", nameF="bbbb1" } 
] 

$scope.second = [ 
    { id="21", nameS="aaaa2", idFirst="11" }, 
    { id="22", nameS="bbbb2", idFirst="12" }, 
    { id="23", nameS="cccc2", idFirst="12" } 
] 

在模板中我有ngRepeat變量第二:

<div ng-repeat="item in second> 
    <div>{{item.nameS}}</div> 
    <div>{{item.idFirst}}</div> 
</div> 

對於每一個項目。 idFirst我想寫出匹配的nameF來代替。達到這個目標的最佳做法是什麼?我似乎無法找出一個簡單的方法來做到這一點,但假設必須有一個。感謝名單!

+0

我想你應該改變你的模型,這樣你就不必做在一個數據庫中加入您的角碼。 –

+0

我對此有所瞭解,但這不是一個很好的解決方案 - 我會有太多的「雙」數據跨模型(或多或少的每個模型mathes 1 db表) – ljerka

+0

檢查更新的答案 –

回答

2

可以使用自定義filter如果你不希望創建一個單獨的對象持有的預期結構。

HTML:

<div ng-repeat="item in second"> 
    <div>{{item.nameS}}</div> 
    <div>{{item.idFirst | getMatchName:first}}</div> 
</div> 

JS:

.filter('getMatchName', function() { 

      return function(strName, arrFirst) { 

      arrFirst.forEach(function(val, key) { 

       if (val.id == strName) { 
       strName = val.nameF; 
       } 

      }) 

      return strName; 
      } 
     }) 

這裏工作plunker

+0

它實際上與@scokmen寫的幾乎相同,只是用過濾器代替「正常」功能。既然他先寫了他的帖子,我會接受他的回答。並給你+1。謝謝你的時間:) – ljerka

+0

@ljerka它不是幾乎相同,你可以使用過濾ng-repeat語法的一部分,它被調用兩次,而不是每次迭代,這是上述情況的情況 –

+0

最後我決定使用你的解決方案,它真的是最好的 - 它速度快,像魅力一樣工作。使用來自@scokmen的解決方案,我遇到了一些問題 - 「準備」數據太慢,所以我經常遇到未定義的變量,第一種方法是不可接受的,因爲我必須將變量idFirst更改(用於編輯和保存目的)。所以我改變了你接受的答案。 – ljerka

-1

你可以把你的模板邏輯有點像代碼,調用其他變量的值:yourValue[another.value].nameF

你的代碼改成這樣,它應該工作

<div ng-repeat="item in second> 
    <div>{{item.nameS}}</div> 
    <div>{{first[item.idFirst].nameF}}</div> 
</div> 
+0

我試過了,但我沒有得到結果(它寫出空白)。雖然,我不明白怎麼可以先[item.idFirst] writeout first.nameF?我也先試了[item.idFirst] .nameF。如果我錯了,請糾正我,但是不要先在item.idFirst + 1位置首先寫出項目[item.idFirst]?像數組[2],例如? – ljerka

+0

@ljerka對不起,我的例子中有一個錯誤,因爲它在匆忙中完成。編輯我的例子。當然,你需要像這樣調用它:first [item.idFirst] .nameF –

+0

就像我寫的那樣,我也是這樣試過的,但它仍然沒有寫出任何內容。 – ljerka

1

如果我理解正確的話,

$scope.getNameF = function(idFirst){ 
    for(var i = 0; i < $scope.first.length; i++){ 
     if($scope.first[i].id === idFirst){ 
      return $scope.first[i].nameF; 
     } 
    } 
    return undefined; 
} 

<div ng-repeat="item in second"> 
    <div>{{item.nameS}}</div> 
    <div>{{getNameF(item.idFirst)}}</div> 
</div> 

編輯

您也可以渲染之前準備數據:

for(var i = 0; i < $scope.second.length; i++){ 
    $scope.second[i].nameF = getNameF($scope.second[i].idFirst); 
} 

<div ng-repeat="item in second"> 
    <div>{{item.nameS}}</div> 
    <div>{{item.nameF}}</div> 
</div> 
+0

是的,其實這正是我首先想到的。但我希望我可以避免每一次重複循環。 – ljerka

+0

您可以在ng-repeat之前準備數據以提高性能 – scokmen

+0

是不是通過循環來準備它們,或者是在ngRepeat循環過程中循環準備? – ljerka