Javascript 检查ng的值是否在数组中,如果在ng重复

Javascript 检查ng的值是否在数组中,如果在ng重复,javascript,angularjs,Javascript,Angularjs,我有一个ng重复循环,通过API检索的葡萄酒列表。我还有一个数组变量,其中包含所有已添加到从数据库获取的收藏夹中的葡萄酒ID。如果用户尚未从列表中添加特定结果,我希望能够显示“添加到收藏夹”按钮。要做到这一点,我想我应该做如下事情: HTML: 我不熟悉.indexOf(),所以我想这可能就是问题所在。但也许我错了。我想你必须改变 favorites.indexOf(wine.Id) !> -1 进入 favorites.indexOf(wine.Id)无效!只能与=、或布尔值一起使用。

我有一个ng重复循环,通过API检索的葡萄酒列表。我还有一个数组变量,其中包含所有已添加到从数据库获取的收藏夹中的葡萄酒ID。如果用户尚未从列表中添加特定结果,我希望能够显示“添加到收藏夹”按钮。要做到这一点,我想我应该做如下事情:

HTML:


我不熟悉.indexOf(),所以我想这可能就是问题所在。但也许我错了。

我想你必须改变

favorites.indexOf(wine.Id) !> -1
进入

favorites.indexOf(wine.Id)<0

!>无效!只能与=、或布尔值一起使用。使用

favorites.indexOf(wine.Id) == -1
如果在数组中找不到元素,indexOf将返回-1。
谢谢你的更正。我被卡住了!>

我建议您将此逻辑移动到控制器,以保持视图尽可能干净:

   $scope.isFavorites = function(id) {
       return $scope.favorites.indexOf(id) !== -1;
   }
你的观点应该是:

<!-- If wine.Id is not yet in the array of all favorite ids, display "Add Button" -->
<a href="#" class="btn btn-primary btn-dark" ng-click="addToFavorites(wine.Id)" ng-if="!isFavorites(wine.Id)">Add</a>
<!-- Else Display Already Added -->
<span ng-if="isFavorites(wine.Id)>Added</span>

favorites.indexOf(wine.Id)!>-1
看起来不像一个正确的角度表达式。注意,当模板中有表达式时,只允许使用一些基本的javascript条件。请参阅以了解可能的情况

与其拥有所有葡萄酒的列表和收藏葡萄酒的列表,不如使用布尔属性
isFavorite
将列表扩展为所有葡萄酒。这对性能也有好处,因为它不需要每次迭代都在第二个列表中搜索葡萄酒

在响应回调循环中(快速和脏):

这样的数组操作可以使用或更优雅地完成

请注意,如果您有一个带有wines(id作为键)的对象,那么每次都可以通过id检索wines,而不是通过索引进行查找
ngRepeat
支持与数组类似的对象

在模板中:

<!-- If wine.Id is not yet in the array of all favorite ids, display "Add Button" -->
<a href="#" class="btn btn-primary btn-dark" ng-click="addToFavorites(wine.Id)" ng-if="!wine.isFavorite"> Add </a>
<!-- Else Display Already Added -->
<span ng-if="wine.isFavorite">Added</span>

补充
您可以使用:


我想应该是我的最爱。indexOf(wine.Id)=-1
@Vohuman,K。托雷斯是对的。永远不会出现<-1的情况。indexOf永远不会返回小于-1的任何内容。正确,我的错误应该在这里是一个工作示例。请参考:)我正在接近,但现在它们都显示为错误。即使我在我的收藏夹数据库中输入了产品id。没关系!我必须将id值更改为字符串。id=id.toString()您应该能够跳过“| | false”,只需执行“return($scope.favorites.indexOf(id)>-1)”。稍微少一点代码:)
   $scope.isFavorites = function(id) {
       return $scope.favorites.indexOf(id) !== -1;
   }
<!-- If wine.Id is not yet in the array of all favorite ids, display "Add Button" -->
<a href="#" class="btn btn-primary btn-dark" ng-click="addToFavorites(wine.Id)" ng-if="!isFavorites(wine.Id)">Add</a>
<!-- Else Display Already Added -->
<span ng-if="isFavorites(wine.Id)>Added</span>
var index = $scope.favorites.indexOf(r.id);
if(index > -1) {
  $scope.favorites[index].isFavorite = true;
} // else isFavorite is undefined, which is falsy
<!-- If wine.Id is not yet in the array of all favorite ids, display "Add Button" -->
<a href="#" class="btn btn-primary btn-dark" ng-click="addToFavorites(wine.Id)" ng-if="!wine.isFavorite"> Add </a>
<!-- Else Display Already Added -->
<span ng-if="wine.isFavorite">Added</span>
<span ng-if="favorites | contains:wine.Id">Added</span>
angular.module('module').filter('contains', function() {
  return function (array, needle) {
    return array.indexOf(needle) >= 0;
  };
});