<html data-ng-app="app">
<head>
<meta charset="utf-8" />
<title>20115875</title>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" />
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js" data-semver="1.3.15"></script>
<script src="http://code.jquery.com/jquery-2.1.3.min.js"></script>
<script src="//netdna.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<script src="app.js"></script>
<style type="text/css">
.highlight {
background-color: lightgreen;
transition: background 200ms;
}
</style>
</head>
<body data-ng-controller="AppCtrl as ctrl">
<div class="container">
<div class="page-header">
<h1>Angular js - Highlight dom when value changes</h1>
</div>
<table class="table">
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tbody>
<tr data-ng-repeat="person in ctrl.people track by $index">
<td data-highlighter="person.firstName">{{ person.firstName }}</td>
<td data-highlighter="person.lastName">{{ person.lastName }}</td>
</tr>
</tbody>
</table>
<button type="button" data-ng-click="ctrl.loadData()" class="btn btn-primary">load new data</button>
<button type="button" data-ng-click="ctrl.changeValue()" class="btn btn-default">change single value</button>
<button type="button" data-ng-click="ctrl.revert()" class="btn btn-default">revert to initial</button>
</div>
</body>
</html>
(function (app, ng) {
'use strict';
var initial = [
{ "firstName": "John", "lastName" : "Doe" },
{ "firstName": "John", "lastName" : "Appleseed" }
];
var changed = [
{ "firstName": "Jane", "lastName" : "Marple" },
{ "firstName": "Hercule", "lastName" : "Poirot" }
];
app.controller('AppCtrl', [function(){
var vm = this;
vm.people = ng.copy(initial);
vm.loadData = function loadData() {
vm.people = ng.copy(changed);
};
vm.changeValue = function changeValue() {
vm.people[0].firstName = 'Jane';
};
vm.revert = function revert() {
vm.people = ng.copy(initial);
};
}]);
app.directive('highlighter', ['$timeout', function($timeout) {
return {
restrict: 'A',
scope: {
model: '=highlighter'
},
link: function(scope, element) {
scope.$watch('model', function (nv, ov) {
if (nv !== ov) {
// apply class
element.addClass('highlight');
// auto remove after some delay
$timeout(function () {
element.removeClass('highlight');
}, 1000);
}
});
}
};
}]);
})(angular.module('app', []), angular);
Output
This bin was created anonymously and its free preview time has expired (learn why). — Get a free unrestricted account
Dismiss xKeyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |