【问题标题】:Ng-repeat generate error when set type-color dynamically动态设置类型颜色时 Ng-repeat 生成错误
【发布时间】:2015-09-22 03:48:06
【问题描述】:

当我在其他 ng-repeat 中的 ng-repeat 中使用插件警报时遇到了一些问题。

我有一个屏幕,我必须在其中选择一个类别,然后我需要选择一些产品。所选产品出现在警报插件中,我有四个按钮来选择所选产品的重要性级别。

每个按钮,在警报容器中设置不同的样式、成功、信息、警告和危险。

问题是:如果我选择了两个类别,并且这两个类别的产品相同,当我更改一个产品的样式时,另一个相同的产品也设置了样式。

我的代码是:

<div style='position:relative; top:0px; left:0px;' ng-repeat="cid in listaCidSelected[$index]">
    <alert type="{{cid.type}}" close="removerCid(tuss, cid, $index)">
        {{cid.CIDSC_DS_DESCRICAO}}
        <button class="btn btn-xs btn-outline btn-primary" ng-click="definirTipoCid('success', cid, $index)"><label>Sem Importância</label></button>&nbsp;
        <button class="btn btn-xs btn-outline btn-info" ng-click="definirTipoCid('info', cid, $index)"><label>Média</label></button>&nbsp;
        <button class="btn btn-xs btn-outline btn-warning" ng-click="definirTipoCid('warning', cid, $index)"><label>Grave</label></button>&nbsp;
        <button class="btn btn-xs btn-outline btn-danger" ng-click="definirTipoCid('danger', cid, $index)"><label>Gravíssima</label></button>&nbsp;
    </alert>
</div>

如果我选择了两个或多个类别并为每个类别使用相同的产品,则此产品的警报会重复相同的样式:(type="{{cid.type}}")

补充控制器方法:

$scope.checkAssociarCidHandler = function(tuss, index, event){
      $scope.listaCheckCid[index] = !$scope.listaCheckCid[index];
      event.currentTarget.innerHTML = $scope.listaCheckCid[index] ? "Finalizar Associação" : "Associar Motivo(s)";
      // Seleciona os checks com as CIDs ja selecionadas
      if ($scope.listaCheckCid[index]){
          for (var i = 0; i < $scope.listaTussSelected.length; i++) {
              if ($scope.listaTussSelected[i].TUSSPR_CD_CODIGO == tuss.TUSSPR_CD_CODIGO){
                  for (var j = 0; j < $scope.listaCidSelected[i].length; j++) {
                      document.querySelector("#ckItemCheckT" + tuss.TUSSPR_CD_CODIGO + 'C' + $scope.listaCidSelected[i][j].CIDSC_CD_CODIGO).checked = true;   
                  }
                  break;
              }
          }
      }
  }


  $scope.checkCidHandler = function(cid, tuss, event){
      for (var i = 0; i < $scope.listaTussSelected.length; i++) {
          if ($scope.listaTussSelected[i].TUSSPR_CD_CODIGO == tuss.TUSSPR_CD_CODIGO){
              // Associa uma CID
              if (event.currentTarget.checked){
                  cid.type = "info";
                  $scope.listaCidSelected[i].push(cid);
              }else{
                  // Desassocia uma CID
                  for (var j = 0; j < $scope.listaCidSelected[i].length; j++) {
                      if ($scope.listaCidSelected[i][j].CIDSC_CD_CODIGO == cid.CIDSC_CD_CODIGO){
                          $scope.listaCidSelected[i].splice(j, 1);
                          break;
                      }
                  }
              }
              break;
          }
      }
  }

  // Define a cor da CID
  $scope.definirTipoCid = function(tipo, cid, index){
      cid.type = tipo;
  }

有人有什么想法吗? 谢谢。

【问题讨论】:

  • 能分享一下你的控制器的代码吗?
  • 我分享了所涉及的方法!感谢您的回复 Shim br!

标签: javascript angularjs


【解决方案1】:

如果产品在 2 个类别中相同,那么两者都会更改(因为是相同的对象),您可以做的是之前为每个类别克隆您的产品。

category.products = angular.copy(original_products)

类似的东西。这里是副本文档:https://docs.angularjs.org/api/ng/function/angular.copy

另一个提示,永远不要在控制器中更改 DOM,为此使用指令。

【讨论】:

  • 嗨 Scoup,因为产品选择是动态的。我永远不知道用户何时会选择相同的产品。当用户选择另一个类别时,这个新类别可以有或没有预览类别有的一些产品。想象一下,您必须制作两个商店清单,并且在两个清单中您都需要一个“鼠标垫”。感谢您的帮助和提示!
  • 所以,你可以不用为类别克隆产品,当你“设置”一个类别的产品使用“副本”时,你会使用更多的内存,但我认为不会是如果不是太多的产品问题。我想不出别的办法了。
  • 独家新闻,我明白为什么有必要复制该对象。这是我的朋友的工作。我只是复制对象并且工作正常。 var novaCid = angular.copy(cid); $scope.listaCidSelected[i].push(novaCid);再次感谢您
【解决方案2】:

这是 Angularjs 的主要问题,它是在克隆过程中,实际上它提供了对它们两者的引用而不是数据,我通过将元素推送到单独的数组或容器中解决了这个问题,然后可以正常工作我。 谢谢

【讨论】:

  • Dinesh,是的,必须复制对象。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2017-04-13
  • 2016-02-13
  • 1970-01-01
  • 2018-12-15
相关资源
最近更新 更多