Reputation: 21652
I'm trying to add table with sorting using AngularJs in the middle of some html page, but when I click on table header to sort table page get updated and view move to top of page, which is of course not desirable property, so how to fix this?
Here is code that reproduce problem:
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<link rel='stylesheet prefetch' href='http://maxcdn.bootstrapcdn.com/bootswatch/3.2.0/sandstone/bootstrap.min.css'>
<style>
</style>
</head>
<body>
<pre>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
<span>Some text </span>
</pre>
<div ng-app="app" ng-controller="MainCtrl">
<table class="table table-bordered">
<thead>
<tr>
<th>
<a href="#" ng-click="orderByField='firstName'; reverseSort = !reverseSort">
First Name <span ng-show="orderByField == 'firstName'"><span ng-show="!reverseSort">^</span><span ng-show="reverseSort">v</span></span>
</a>
</th>
<th>
<a href="#" ng-click="orderByField='lastName'; reverseSort = !reverseSort">
Last Name <span ng-show="orderByField == 'lastName'"><span ng-show="!reverseSort">^</span><span ng-show="reverseSort">v</span></span>
</a>
</th>
<th>
<a href="#" ng-click="orderByField='age'; reverseSort = !reverseSort">
Age <span ng-show="orderByField == 'age'"><span ng-show="!reverseSort">^</span><span ng-show="reverseSort">v</span></span>
</a>
</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="emp in data.employees|orderBy:orderByField:reverseSort">
<td>{{emp.firstName}}</td>
<td>{{emp.lastName}}</td>
<td>{{emp.age}}</td>
</tr>
</tbody>
</table>
</div>
<script src='http://ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js'></script>
<script>
var app = angular.module('app', []);
app.controller('MainCtrl', function($scope) {
$scope.orderByField = 'firstName';
$scope.reverseSort = false;
$scope.data = {
employees: [{
firstName: 'John',
lastName: 'Doe',
age: 30
},{
firstName: 'Frank',
lastName: 'Burns',
age: 54
},{
firstName: 'Sue',
lastName: 'Banter',
age: 21
}]
};
});
</script>
</body>
Upvotes: 1
Views: 44
Reputation: 5080
The best solution is to delete completely the href tags.
see ngHref
Upvotes: 0
Reputation: 85558
Remove the hash fragment from the anchor tags' href
:
<a href="#" ng-click="orderByField='firstName'; reverseSort = !reverseSort">
should be
<a href="" ng-click="orderByField='firstName'; reverseSort = !reverseSort">
or
<a ng-click="orderByField='firstName'; reverseSort = !reverseSort">
I personally prefer setting href=""
because some (of my) styling depends on the existense of the href
attribute. But angular itself is "designed" to leave out href
in order to prevent default action -> https://docs.angularjs.org/api/ng/directive/a#
Upvotes: 2