比较两个数组并使用 ng-style 标记数组中的相等条目

Compare two arrays and using ng-style to mark equal entries in the arrays

我有一个列表,其中显示了数据库中的单词查询,从那里我可以单击一个单词,它会被推送到另一个列表,我可以将其保存。有了这个我可以创建不同的单词表。我想做的是如果我已经将它们推到我的新列表中,则给它们另一种颜色。

为此,我在我的控制器中使用了一个函数来将两个列表与 angular.foreach 进行比较。如果 wordFromQuery._id === wordOnNewList._id 我用 ng-style 给了单词另一种背景颜色。

这是我的代码:

查看

ng-repeat="word in searchWords" ng-click="addWordToSet(word)" ng-class="isInside(word)" ng-style="{ background: choosenWords.value == 'exist' ? 'lightgreen' : 'white' }"

我遍历单词查询 (searchWords) 并使用 addWordtoSet(word) 将它们推送到我的另一个数组(效果很好)。 isInside(word) 将执行 angular.foreach 来比较两个数组,根据 isInside 函数的 if 语句,ng-style 应该提供不同的样式。

控制器

    $scope.isInside = function (word) {
      angular.forEach($scope.currentWordlist, function (item) {
        if (item._id === word._id) {
          $scope.choosenWords = {value: 'exist'};
        } else {
          $scope.choosenWords = {value: 'notOnList'};
        }
       });
    };

angular.forEach 比较两个数组中的单词。 currentWordList 是我用 addWordToSet

推送的数组

发生的事情是 searchword 数组中的一个词变成了绿色(并且它的集合为 +1,所以如果 arraypos.0 中的词是正确的,那么 arraypos.1 会变成绿色)。

我怀疑我对 ng-class 元素做错了,但我没有找到另一个用其他方式获得 word._id 的好机会。我在这里做错了什么吗?

我希望得到提示或提示。谢谢!

更新

它与 addWordToSet 函数一起工作得很好:

      $scope.addWordToSet = function (word) {
        var exists = false;
        angular.forEach($scope.currentWordlist, function (item) {
          if (item._id === word._id) {
          exists = true;
        }
      });
        if (exists === false) {
          $scope.currentWordlist.push(word);
        }
      };

我认为我唯一需要的不是点击时执行此操作,而是立即不点击任何内容。 my ng-class="isInside(word)" 是正确的选择吗?

尝试

$scope.choosenWords.value = 'exist';

同时在控制器启动时初始化 choosenWords。

如果这不起作用,请检查 ng 模块的执行优先顺序。

控制器是通过partial初始化的吗?

您可以在同一函数内将 color 分配给 variable 并在视图中使用它。

$scope.isInside = function (word) {
  angular.forEach($scope.currentWordlist, function (item) {
    if (item._id === word._id) {
      $scope.choosenWords = {value: 'exist'};
      $scope.color = 'lightgreen'
    } else {
      $scope.choosenWords = {value: 'notOnList'};
      $scope.color = 'white'
    }
   });
};

ng-style="{'background-color':color}"

查看:

ng-repeat="word in searchWords" ng-click="addWordToSet(word)" ng-class="isInside(word)" ng-style="{'background-color':color}" }"

我和一个朋友坐在一起,我们想出了这个问题的一个工作版本,所以这里是解决方案,以防有人遇到类似的问题。

在控制器中我们使用了以下函数:

    $scope.isSelected = function (word) {
      var found = false;
      angular.forEach($scope.currentWordlist, function (item) {
        if (item._id === word._id) {
          found = true;
        }
      });
    return found;
    };

它使用 foreach 比较数组,如果有匹配的 ID,则找到 bool returns true。

在视图中我们使用了以下内容:

ng-class="isSelected(word) ? 'marked' : 'unmarked'"

使用标记或未标记的 css class,在我的例子中,将匹配的单词着色为绿色(标记)。所有其他单词的背景颜色都变白了。

这里是 CSS:

.marked {
  background: $lightgreen;
}

.unmarked {
  background: $nicewhite;
}

在我的例子中,我使用 scss 和颜色变量,但是你当然可以使用所有其他颜色,比如红色;或#fff。其结果是两个数组,它们是视图。第一个是来自数据库的搜索查询,它显示所有单词。第二个是一个新数组,您可以在其中通过单击其中一个单词来推送单词。如果你这样做的话,这个词会被推送并且它会变成绿色背景。就是这样,我希望这是个好消息。