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.
'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. – senschenWenn ich debugge, kann ich sehen, dass es nicht "undefiniert" ist. Und dann geht es weiter und lege die CSS-Klasse an – MrProgram