ng-repeat 排序箭头在 javascript 数据表中不起作用
ng-repeat sorting arrow not working in javascript datatables
我对 AngularJs 和数据table 很陌生。
我需要使用 ng-repeat 在 table 行中填充数据。
我能够填充行并首次启用排序。
当我单击箭头进行排序时,行数据将被擦除。
这是我的table数据
<table datatable="ng" id="example" class="display" cellspacing="0" width="100%">
<thead>
<tr>
<th class="col1">Campaign Name</th>
<th class="col4">Description</th>
<th class="col5">Activate/Deactivate</th>
<th class="col5">edit</th>
<!-- <th class="col5">status</th> -->
<!-- <th class="col5">Details</th> -->
</tr>
</thead>
<tbody >
<tr ng-repeat="campaign in campaignListData">
<td>{{campaign.campaignObject.campaignName}}</td>
<td>{{campaign.campaignObject.campaignMessage}}</td>
<td><button type="button" class="pay-amount pending" style="margin-top:-10px;margin-right:17px;width:128px;height:34px"
value = "{{ campaign.campaignObject.label }}" title="ACTIVATE" ng-click="updateCampaignStatus(campaign.campaignObject.id)">
<span style="margin-left:-10px;margin-right:17px;width:128px;height:34px">{{ campaign.campaignObject.label }}</span>
</button>
</td>
<td><a href="<c:url value="${contextPath}/merchant/manageCampaign/editCampaignConfiguration"/>?campaignId={{ campaign.campaignObject.id }}">
<img class="tableImage" style="margin-left:-8px;margin-top:-10px;" src="<c:url value="/resources/images/setting.png" />" ></a>
</td>
</tr>
</tbody>
</table>
这是我的排序javascript代码
<script type="text/javascript">
$(document).ready(function() {
$("#noCampaignData").hide();
//$("#example_paginate").hide();
var rowCount = $("#example tr").length;
console.log("Row count value is"+rowCount);
if (rowCount >= 0) {
console.log("Entered into Sorting");
$("#example").dataTable({
"pagingType" : "full_numbers",
"order" : [ [ 2, "desc" ] ]
});
}
});
</script>
我得到 tr 的行数是 1
我在页面底部包含了js文件
<script src="<c:url value="/resources/js/CampaignListController.js" />"></script>
<script src="<c:url value="/resources/js/jquery.dataTables.min.js" />"></script>
当我加载数据时,使用 ng-repeat 可以很好地加载数据。但是当我点击 header 进行升序或降序排序时,行被擦掉了。
请告诉我哪里做错了?
我无法对数据进行升序、降序排序,分页根本不起作用。
对不起我的英语。
无意冒犯,但这是 jQuery 和 Angular 的典型 mix-up 思维,或者对 Angular 工作原理缺乏理解。这里尝试将一些 jQuery 逻辑包装到 angular digest loop. Read a great answer to the question “Thinking in AngularJS” if I have a jQuery background?
您永远无法组合 $(document).ready(function() {
和 Angular。事实上,您可以非常确定 ready()
在 Angular 完成其 ng-repeat
业务之前很久就已执行。这就是为什么行数(header)总是为 1 以及当您单击 header 时行消失的原因。在您获得行数时,没有插入任何行,并且在您实例化 dataTable()
时,没有插入任何行。
您可以使用$timeout
强制延迟代码,或强制它进入下一个摘要循环:
$scope.initDataTable = function() {
$timeout(function() {
$("#noCampaignData").hide();
//$("#example_paginate").hide();
var rowCount = $("#example tr").length;
console.log("Row count value is"+rowCount);
if (rowCount >= 0) {
console.log("Entered into Sorting");
$("#example").dataTable({
"pagingType" : "full_numbers",
"order" : [ [ 2, "desc" ] ]
});
}
}, 200)
}
或创建 directive that instantiates the dataTable once the data is populated by ng-repeat
, as demonstrated in multiple answers for ng-repeat finish event :
.directive('repeatDone', function() {
return function(scope, element, attrs) {
if (scope.$last) { // all are rendered
scope.$eval(attrs.repeatDone);
}
}
})
...
<tr ng-repeat="campaign in campaignListData" repeat-done="initDataTable">
...
$scope.initDataTable = function() {
$("#noCampaignData").hide();
$("#example").dataTable({
...
});
}
希望这对您有所帮助。
下面的示例使用了 AngularJs 和数据表。过滤、分页和排序工作正常。
下载 angular-datatable 并将 angular-datatables.min.js 文件放入您的项目中,就像我在行 <script src="angular-datatables/dist/angular-datatables.min.js"></script>
[ 中所做的那样=13=]
希望对您有所帮助。
<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="http://cdn.datatables.net/1.10.7/js/jquery.dataTables.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
<script src="angular-datatables/dist/angular-datatables.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="http://cdn.datatables.net/1.10.7/css/jquery.dataTables.css">
</head>
<body>
<div ng-app="AngularWayApp" ng-controller="AngularWayCtrl">
<table datatable="ng" class="table">
<thead>
<tr>
<th>Name</th>
<th>City</th>
<th>Country</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="name in names" ng-click="testingClick(name)">
<td>{{name.Name}}</td>
<td>{{name.City}}</td>
<td>{{name.Country}}</td>
</tr>
</tbody>
</table>
<script>
var app = angular.module('AngularWayApp', ['datatables']);
app.controller('AngularWayCtrl', function($scope, $http)
{
$http.get("http://www.w3schools.com/angular/customers_mysql.php").success(function (response)
{
$scope.names = response.records;
});
$scope.testingClick = function(name)
{
console.log(name);
};
});
</script>
</div>
</body>
</html>
我对 AngularJs 和数据table 很陌生。 我需要使用 ng-repeat 在 table 行中填充数据。 我能够填充行并首次启用排序。 当我单击箭头进行排序时,行数据将被擦除。
这是我的table数据
<table datatable="ng" id="example" class="display" cellspacing="0" width="100%">
<thead>
<tr>
<th class="col1">Campaign Name</th>
<th class="col4">Description</th>
<th class="col5">Activate/Deactivate</th>
<th class="col5">edit</th>
<!-- <th class="col5">status</th> -->
<!-- <th class="col5">Details</th> -->
</tr>
</thead>
<tbody >
<tr ng-repeat="campaign in campaignListData">
<td>{{campaign.campaignObject.campaignName}}</td>
<td>{{campaign.campaignObject.campaignMessage}}</td>
<td><button type="button" class="pay-amount pending" style="margin-top:-10px;margin-right:17px;width:128px;height:34px"
value = "{{ campaign.campaignObject.label }}" title="ACTIVATE" ng-click="updateCampaignStatus(campaign.campaignObject.id)">
<span style="margin-left:-10px;margin-right:17px;width:128px;height:34px">{{ campaign.campaignObject.label }}</span>
</button>
</td>
<td><a href="<c:url value="${contextPath}/merchant/manageCampaign/editCampaignConfiguration"/>?campaignId={{ campaign.campaignObject.id }}">
<img class="tableImage" style="margin-left:-8px;margin-top:-10px;" src="<c:url value="/resources/images/setting.png" />" ></a>
</td>
</tr>
</tbody>
</table>
这是我的排序javascript代码
<script type="text/javascript">
$(document).ready(function() {
$("#noCampaignData").hide();
//$("#example_paginate").hide();
var rowCount = $("#example tr").length;
console.log("Row count value is"+rowCount);
if (rowCount >= 0) {
console.log("Entered into Sorting");
$("#example").dataTable({
"pagingType" : "full_numbers",
"order" : [ [ 2, "desc" ] ]
});
}
});
</script>
我得到 tr 的行数是 1
我在页面底部包含了js文件
<script src="<c:url value="/resources/js/CampaignListController.js" />"></script>
<script src="<c:url value="/resources/js/jquery.dataTables.min.js" />"></script>
当我加载数据时,使用 ng-repeat 可以很好地加载数据。但是当我点击 header 进行升序或降序排序时,行被擦掉了。
请告诉我哪里做错了? 我无法对数据进行升序、降序排序,分页根本不起作用。
对不起我的英语。
无意冒犯,但这是 jQuery 和 Angular 的典型 mix-up 思维,或者对 Angular 工作原理缺乏理解。这里尝试将一些 jQuery 逻辑包装到 angular digest loop. Read a great answer to the question “Thinking in AngularJS” if I have a jQuery background?
您永远无法组合 $(document).ready(function() {
和 Angular。事实上,您可以非常确定 ready()
在 Angular 完成其 ng-repeat
业务之前很久就已执行。这就是为什么行数(header)总是为 1 以及当您单击 header 时行消失的原因。在您获得行数时,没有插入任何行,并且在您实例化 dataTable()
时,没有插入任何行。
您可以使用$timeout
强制延迟代码,或强制它进入下一个摘要循环:
$scope.initDataTable = function() {
$timeout(function() {
$("#noCampaignData").hide();
//$("#example_paginate").hide();
var rowCount = $("#example tr").length;
console.log("Row count value is"+rowCount);
if (rowCount >= 0) {
console.log("Entered into Sorting");
$("#example").dataTable({
"pagingType" : "full_numbers",
"order" : [ [ 2, "desc" ] ]
});
}
}, 200)
}
或创建 directive that instantiates the dataTable once the data is populated by ng-repeat
, as demonstrated in multiple answers for ng-repeat finish event :
.directive('repeatDone', function() {
return function(scope, element, attrs) {
if (scope.$last) { // all are rendered
scope.$eval(attrs.repeatDone);
}
}
})
...
<tr ng-repeat="campaign in campaignListData" repeat-done="initDataTable">
...
$scope.initDataTable = function() {
$("#noCampaignData").hide();
$("#example").dataTable({
...
});
}
希望这对您有所帮助。
下面的示例使用了 AngularJs 和数据表。过滤、分页和排序工作正常。
下载 angular-datatable 并将 angular-datatables.min.js 文件放入您的项目中,就像我在行 <script src="angular-datatables/dist/angular-datatables.min.js"></script>
[ 中所做的那样=13=]
希望对您有所帮助。
<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="http://cdn.datatables.net/1.10.7/js/jquery.dataTables.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
<script src="angular-datatables/dist/angular-datatables.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="http://cdn.datatables.net/1.10.7/css/jquery.dataTables.css">
</head>
<body>
<div ng-app="AngularWayApp" ng-controller="AngularWayCtrl">
<table datatable="ng" class="table">
<thead>
<tr>
<th>Name</th>
<th>City</th>
<th>Country</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="name in names" ng-click="testingClick(name)">
<td>{{name.Name}}</td>
<td>{{name.City}}</td>
<td>{{name.Country}}</td>
</tr>
</tbody>
</table>
<script>
var app = angular.module('AngularWayApp', ['datatables']);
app.controller('AngularWayCtrl', function($scope, $http)
{
$http.get("http://www.w3schools.com/angular/customers_mysql.php").success(function (response)
{
$scope.names = response.records;
});
$scope.testingClick = function(name)
{
console.log(name);
};
});
</script>
</div>
</body>
</html>