如何使用带有 angular.js 和角度材料的 ngif 从 DOM 隐藏元素?
How to hide an element from DOM using ngif with angular.js and angularmaterial?
我在前端使用 angular.js 1.5 和 angular material 来使用数据库中的对象加载 DOM。
在其中一个中继器中,我需要检查一个对象是否已包含在另一个范围内 javascript 数组中。我尝试使用 Array.indexOf()
、Array.forEach
和循环遍历每个元素的标准来做到这一点,但它并没有按照我需要的方式发生。我一定是在做一些愚蠢的事情,阻止逻辑正常地 运行,理想情况下,如果当前对象存在于数组中,方法应该 return false,如果不存在则为 true。
用例是用户需要将项目 ObjA 从另一个列表 (Objs)[=18= 添加到列表 (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;
}
}
我也试过匹配object 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
我写了一个 plunk 代表同样的问题
您仅将 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
来过滤 "used" 技能列表会更干净
在你的代码中
<ul>
<li ng-repeat="friend in friends">
<li ng-repeat="skill in skills" ng-if="skillExists(skill,friend.skills)">{{skill.name}}
</li>
</ul>
li
标签不能直接在另一个li
标签下使用。因为您正在使用这种方式 friend.skill
将不会被定义,这就是 skillExists
不起作用的原因之一。
根据我的经验,在您的 skillExists
方法中,我建议您不要直接比较两个对象。始终尝试使用 id
或一些 unique attribute
来区分每个对象,并且该键应用于对象比较。所以在这里你应该使用 name
属性而不是比较整个对象。
您的代码
if(list[i]===skill){
return false;
}
而不是使用
if(list[i].name === skill.name){
return false;
}
这是工作示例的 link。 https://plnkr.co/edit/mvskLPsTH8eJv6OfPFsB
我在前端使用 angular.js 1.5 和 angular material 来使用数据库中的对象加载 DOM。
在其中一个中继器中,我需要检查一个对象是否已包含在另一个范围内 javascript 数组中。我尝试使用 Array.indexOf()
、Array.forEach
和循环遍历每个元素的标准来做到这一点,但它并没有按照我需要的方式发生。我一定是在做一些愚蠢的事情,阻止逻辑正常地 运行,理想情况下,如果当前对象存在于数组中,方法应该 return false,如果不存在则为 true。
用例是用户需要将项目 ObjA 从另一个列表 (Objs)[=18= 添加到列表 (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;
}
}
我也试过匹配object 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 我写了一个 plunk 代表同样的问题
您仅将 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
来过滤 "used" 技能列表会更干净
在你的代码中
<ul>
<li ng-repeat="friend in friends">
<li ng-repeat="skill in skills" ng-if="skillExists(skill,friend.skills)">{{skill.name}}
</li>
</ul>
li
标签不能直接在另一个li
标签下使用。因为您正在使用这种方式 friend.skill
将不会被定义,这就是 skillExists
不起作用的原因之一。
根据我的经验,在您的 skillExists
方法中,我建议您不要直接比较两个对象。始终尝试使用 id
或一些 unique attribute
来区分每个对象,并且该键应用于对象比较。所以在这里你应该使用 name
属性而不是比较整个对象。
您的代码
if(list[i]===skill){
return false;
}
而不是使用
if(list[i].name === skill.name){
return false;
}
这是工作示例的 link。 https://plnkr.co/edit/mvskLPsTH8eJv6OfPFsB