2016-04-18 38 views
0

我有一張表,我從服務器可以將新行推送到客戶端。在一些列的我用一個指令:插入新項目時觸發指令手錶

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); 
       } 

      } 
     }); 
    } 
}; 
}]); 

這樣做的問題是,當我從服務器端推出新行插入到表中的一些人觸發的手錶,即使是第一次沒有什麼改變。

<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> 

很難一點點地在plunker重建這一點,但確實anyony現在怎麼當物品被插入第一次手錶可以被觸發?值(newValue,oldValue)來自哪裏?因爲oldValue是錯誤的。

編輯:只是要更清楚。 newValueoldValue不是他們undefined當我推出新行。

+0

'全亂了OLDVAL '和'newVal'都以'undefined'開頭。所以當你第一次設置你的數據時,手錶當然會開火,因爲'newVal'將會有實際的數據。 – senschen

+0

當我調試時,我可以看到它不是'undefined'。然後它繼續前進,並把CSS類 – MrProgram

回答

0

這是怎樣的一個嚴重的錯誤由我......當然,它得到當我改變了數組,其中我認爲行中,track by $index搞的一團糟up..I改成了track by row.Id

0

它可能是oldValue是undefined/null,但是然後parseFloat將它變成可處理的東西。也許嘗試檢查parseFloat周圍的oldValue的行爲?