2016-04-18 4 views
0

Ich habe eine Tabelle, wo ich vom Server neue Zeilen an den Client schieben kann. Auf einigen der Spalten verwende ich eine Direktive:directive watch wird beim Einfügen neuer Elemente ausgelöst

angular.module('app').directive('highlighter', ['$timeout', function ($timeout) { 
return { 
    restrict: 'A', 
    scope: { 
     model: '=highlighter' 
    }, 
    link: function (scope, element) { 
     scope.$watch('model', function (newValue, oldValue) { 
      var nv = parseFloat(newValue); 
      var ov = parseFloat(oldValue); 
      if (nv !== ov) { 
       if (nv > ov) { 
        // apply class 
        element.addClass('highlightUp'); 

        // auto remove after some delay 
        $timeout(function() { 
         element.removeClass('highlightUp'); 
        }, 2000); 
       } else { 
        // apply class 
        element.addClass('highlightDown'); 

        // auto remove after some delay 
        $timeout(function() { 
         element.removeClass('highlightDown'); 
        }, 2000); 
       } 

      } 
     }); 
    } 
}; 
}]); 

Das Problem dabei ist, dass, wenn ich neue Zeilen in die Tabelle von Server-Seite schieben einige von ihnen die Uhr löst, auch wenn es das erste Mal, und nichts hat sich geändert.

<tbody> 
       <tr dir-paginate="row in vm.rows 
        | filter:searchText 
        | filter:row.IsVisible 
        | orderBy:sortRows:vm.sortReverse 
        | itemsPerPage:vm.pagination.pageSize track by $index" 
        data-ng-click="toggleNode(row)" 
        data-ng-show="row.IsVisible"> 
        <td ng-repeat="column in vm.columns"> 
         <span ng-if="shouldBeHighlighted">{{renderCellValue(row, column)}}</span> 
        </td> 
       </tr> 
      </tbody> 

Es ist ein wenig schwer, dies in Plunker neu zu erstellen, aber tut anyony nun, wie die Uhr kann ausgelöst werden, wenn die Elemente erstes Mal eingeführt werden? Und woher kommen die Werte (newValue, oldValue)? Weil der oldValue falsch ist.

EDIT: Nur etwas klarer zu sein. newValue und oldValue ist nicht von ihnen undefined wenn ich neue Zeilen ausschiebe.

+0

'zu track by row.Id geändert oldVal 'und' newVal' beginnen beide als 'undefined'. Wenn Sie also Ihre Daten zum ersten Mal einstellen, wird die Uhr natürlich ausgelöst, weil 'newVal' tatsächlich Daten enthält. – senschen

+0

Wenn ich debugge, kann ich sehen, dass es nicht "undefiniert" ist. Und dann geht es weiter und lege die CSS-Klasse an – MrProgram

Antwort

0

Das war irgendwie ein schwerer Fehler von mir ... Natürlich ist es alles vermasselt wird, wenn ich das Array ändern, in dem ich die Zeilen halten, bekommen die track by $index messed up..I es

0

könnte es sein, dass der oldValue nicht definiert/null ist, aber dann parseFloat macht es in etwas verarbeitbar. Vielleicht versuchen Sie, das Verhalten von oldValue in der Nähe von parseFloat zu untersuchen?

Verwandte Themen