AngularJS: Creating headers in an ng-repeat
I came across this great directive here to create headers based on sections in an ng-repeat. The cides works like a charm.
Here is a copy.
// html
<div ng-repeat="item in data.items | orderBy:... | filter:... as filteredItems" header-list objects="filteredItems" header="getHeader">
<div ng-show="item.$header">{{item.$header}}</div>
<div>Your normal content</div>
</div>
// controller function
$scope.getHeader = function(item) {
return item.name.slice(0, 1);
}
// directive
app.module("...").directive('headerList', function () {
return {
restrict: 'A',
scope: {
objects: '=',
header: '=' // This must be a function or instance method
},
link: function(scope) {
scope.$watch('objects', function() {
var lastHeader, currentHeader;
scope.objects.forEach(function (obj) {
// We pass obj twice, so it can be used is instance method or regular function that takes the object as argument.
currentHeader = scope.header.call(obj, obj);
// in order to display a header per type, we mark the first event of each kind as header
if (currentHeader !== lastHeader) {
obj.$header = currentHeader;
lastHeader = currentHeader;
} else {
obj.$header = null;
}
});
});
}
}
});
Here is a copy.
// html
<div ng-repeat="item in data.items | orderBy:... | filter:... as filteredItems" header-list objects="filteredItems" header="getHeader">
<div ng-show="item.$header">{{item.$header}}</div>
<div>Your normal content</div>
</div>
// controller function
$scope.getHeader = function(item) {
return item.name.slice(0, 1);
}
// directive
app.module("...").directive('headerList', function () {
return {
restrict: 'A',
scope: {
objects: '=',
header: '=' // This must be a function or instance method
},
link: function(scope) {
scope.$watch('objects', function() {
var lastHeader, currentHeader;
scope.objects.forEach(function (obj) {
// We pass obj twice, so it can be used is instance method or regular function that takes the object as argument.
currentHeader = scope.header.call(obj, obj);
// in order to display a header per type, we mark the first event of each kind as header
if (currentHeader !== lastHeader) {
obj.$header = currentHeader;
lastHeader = currentHeader;
} else {
obj.$header = null;
}
});
});
}
}
});
Comments
Post a Comment