2016-09-02 55 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