如何使用带有angular.js和angularmaterial的ngif隐藏DOM中的元素?

时间:2016-06-18 14:17:25

标签: javascript arrays angularjs angular-material

我正在使用angular.js 1.5和前端的角度材质来加载DOM和数据库中的对象。 在其中一个转发器中,我需要检查一个对象是否已经包含在另一个范围内的javascript数组中。我尝试使用Array.indexOf()Array.forEach进行此操作,并在每个元素上循环标准循环,但它不会按照我需要的方式发生。我必须做一些愚蠢的事情,以防止逻辑正常运行。理想情况下,如果当前对象存在于数组中,则方法应返回false,否则返回true。

用例是用户需要将项目 ObjA 添加到另一个列表(Objs)的列表(ObjX.Objs)

我的前端HTML代码:

//here there's an object that contains an array of objects 
<div ng-controller="myFirstController" ng-init="findOne()">
<md-list-item ng-repeat="ObjA in ObjX.Objs" >
</md-list-item>
<div ng-controller="mySecondcontroller" ng-init="find()">
<md-list-item ng-repeat="ObjA in Objs" ng-if="ObjAExists(ObjA, ObjX.Objs)">
</md-list-item>
</div>
</div>

控制器方法:

 $scope.ObjAExists = function(ObjA, list){
     for(var m = 0; m<list.length; m++){
         if(list[m] === ObjA){
             return false;
         }
         else return true;
     }
 }

我也尝试匹配对象Id没有区别

 $scope.ObjAExists = function(ObjA, list){
     for(var m = 0; m<list.length; m++){
         if(list[m]._id == ObjA._id){
             return false;
         }
         else return true;
     }
 }

Filter skills plunk 我写了一个代表相同问题的插件

2 个答案:

答案 0 :(得分:2)

您只需将ObjA与列表中的第一个元素进行比较。您应该从return true;循环中取出for。 它将是:

$scope.ObjAExists = function(ObjA, list){
 for(var m = 0; m<list.length; m++){
     if(list[m]._id == ObjA._id){
         return false;
     }
 }
 return true;
}

*方法的名称当然应该是..NotExists

此处example通过评论回答了您的问题。注意:

  • 我们无法通过引用进行比较,因为friend.skills与我们通常skills list的对象不同。这就是name属性进行比较的原因。
  • 使用filter代替ng-if过滤&#34;使用&#34;会更清晰技能清单

答案 1 :(得分:1)

在您的代码中

<ul>
  <li ng-repeat="friend in friends">
   <li ng-repeat="skill in skills" ng-if="skillExists(skill,friend.skills)">{{skill.name}}
   </li>
</ul>

li tage不能直接在另一个li标记下使用。因为您使用这种方式friend.skill将无法定义,这就是skillExists无效的原因之一。

根据我的经验,我现在使用skillExists方法,我建议您不要直接比较两个对象。始终尝试使用id或某些unique attribute来区分每个对象,并且该密钥应该用于对象比较。所以在这里你应该使用name属性而不是比较整个对象。

您的代码

if(list[i]===skill){
      return false;
 }

而不是使用

if(list[i].name === skill.name){
      return false;
}

以下是工作示例的链接。 https://plnkr.co/edit/mvskLPsTH8eJv6OfPFsB