根据范围变化更新 class

Update class based on scope changes

我在这里遇到了一点挑战,我无法找到任何合适的解决方案。 我正在使用一个指令:

app.directive('colorcode', function () {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            attrs.$observe('colorcode', function(data) {
                var status = attrs.colorcode.replace(/ /g, '_');
                element.addClass(status + "_status");
            }, true);
        }
    }
});

根据来自 json 调用的数据状态应用背景颜色。

在 html 中是这样的:

<div ng-repeat="(key, value) in entTask[0].tasks">
   <h5>{{key}}</h5>
   <div class="progress">
     <div class="progress-bar" colorcode="{{value.status}}">
       <span>{{value.status}}</span>
     </div>
   </div>
</div>

该指令根据编译时的状态添加了一个class

<div class="progress-bar status1" colorcode="{{value.status}}">

现在我遇到的问题是,当我更新 ng-repeat 范围时,该指令再次执行工作,但是 classes 像这样加起来。

<div class="progress-bar status1 status2 ..." colorcode="{{value.status}}">

我应该注意旧值并删除它 class 但我无法使 $watch 正常工作...所以我很困惑...

感谢您的任何建议!

出现此问题是因为当您更新 ng-repeat 范围时,angular 不会为项目重新创建 html。所以,我看到两个选项。

1.Create 从旧对象创建新任务对象然后更改新对象的 属性 并用新对象替换旧对象。这使得 angular 为更新的模型对象创建一个新的 DOM 对象。像这样:

$scope.change = function(index) {
  var copy = angular.copy($scope.entTask[0].tasks[index]);
  $scope.tasks[index].status = "new status";
  $scope.entTask[0].tasks[index] = copy;
};

2.Or 您可以停止使用自定义指令来更改 css 并开始使用 ng-class。像这样:

// in the controller
$scope.convertToClassName = function (status) {
  // convert to a proper class name
  return convertedStatus;
};

// on the view
<div class="progress-bar" ng-class="convertToClassName(value.status)">
  <span>{{value.status}}</span>
</div>