- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要显示一个 5 列表数据,其中包含 3 列标题,类似于下面的屏幕截图(请忽略带有黄色星号的表正文中的第一列)。
帮我解决下面给出的几个问题。
last 3 runs
的 colspan 设为 3 时,我没有得到过滤器。 filterStatusFor0($column)
进行选择过滤器是否正确/最佳方式? , filterStatusFor1($column)
& filterStatusFor2($column)
在我的代码中? <div class="col-md-8">
<table ng-table="taskDetailTableParams" show-filter="true" class="table upgradeTaskDetailTable text-left table-bordered">
<thead>
<th>Task Name</th>
<th>Type of Task</th>
<th colspan="3">Last 3 runs</th>
</thead>
<tbody>
<tr ng-repeat="item in $data" height="10px" class="animate" ng-animate="{enter: 'animate-enter', leave: 'animate-leave'}">
<td data-title="'Task Name'" class="text-left col-sm-4 col-md-4 col-lg-4" header-class="text-left" filter="{ 'name': 'text' }" sortable="'name'">{{ item.name }}</td>
<td data-title="'Type of Task'" class="text-left col-sm-2 col-md-2 col-lg-2" header-class="text-left" filter="{ 'type': 'text' }" sortable="'type'">{{item.type}}</td>
<td data-title="'latest Run'" class="text-left col-sm-2 col-md-2 col-lg-2" header-class="text-left" filter="{ 'selectIdFor0': 'select' }" sortable="'selectIdFor0'" filter-data="filterStatusFor0($column)"><img ng-src="{{ item.statusImageFor0 }}" title="{{ item.statusFor0 }}" data-toggle="tooltip" data-placement="bottom" /></td>
<td data-title="'2nd Latest Run'" class="text-left col-sm-2 col-md-2 col-lg-2" header-class="text-left" filter="{ 'selectIdFor1': 'select' }" sortable="'selectIdFor1'" filter-data="filterStatusFor1($column)"><img ng-src="{{ item.statusImageFor1 }}" title="{{ item.statusFor1 }}" data-toggle="tooltip" data-placement="bottom" /></td>
<td data-title="'3rd Latest Run'" class="text-left col-sm-2 col-md-2 col-lg-2" header-class="text-left" filter="{ 'selectIdFor2': 'select' }" sortable="'selectIdFor2'" filter-data="filterStatusFor2($column)"><img ng-src="{{ item.statusImageFor2 }}" title="{{ item.statusFor2 }}" data-toggle="tooltip" data-placement="bottom" /></td>
</tr>
</tbody>
</table>
</div>
$scope.filterStatusFor0 = function(column) {
var def = $q.defer(),
arr = [],
filterStatus = [];
angular.forEach($scope.taskDetailData, function(item) {
if (jQuery.inArray(item.selectIdFor0, arr) === -1) {
arr.push(item.selectIdFor0);
filterStatus.push({
'id': item.selectIdFor0,
'title': item.statusFor0
});
}
});
filterStatus.sort(function(a, b) {
if (a.id < b.id)
return -1;
if (a.id > b.id)
return 1;
return 0;
});
def.resolve(filterStatus);
return def;
};
最佳答案
您可以使用 template-header="my_header.html"
添加自定义标题作为直接属性,然后获取 colgroup 的最简单方法是在普通标题模板上方添加一行。
因此,将所有过滤器放置到位更容易,对于该行中的其他空单元格,您可以执行 css 样式来移除边框以获得更好看的表格。 (未添加到更新的 plunkr 中)。
对于使用过滤方法的问题的第二部分。您重复了三遍相同的代码(这不遵循 DRY 原则)。
您可以通过添加 id
来改进这一点。到您的函数,因此您将只有一个使用不同 ID 调用的过滤器方法。
以下是添加了自定义标题模板的更新代码。您也可以在此 plunkr 中找到代码.
var app = angular.module('main', ['ngTable'])
.controller('DemoCtrl', function($scope, $q, $filter, ngTableParams, $log) {
$scope.taskDetailData = [{
"index": 0,
"id": "000ABC0G000000000WQQ",
"name": "Jaantestsameepidentity",
"type": "Hadoop",
"statusFor0": "Failed",
"selectIdFor0": "Failed",
"statusImageFor0": "http://i.imgur.com/knyz0Ye.png",
"statusFor1": "Failed",
"selectIdFor1": "Failed",
"statusImageFor1": "http://i.imgur.com/knyz0Ye.png",
"statusFor2": "Failed",
"selectIdFor2": "Failed",
"statusImageFor2": "http://i.imgur.com/knyz0Ye.png"
}, {
"index": 1,
"id": "000ABC0I000000000WQC",
"name": "Salesorder_netsuite",
"type": "Salesforce",
"statusFor2": "No runs available",
"statusFor1": "No runs available",
"selectIdFor2": "stopped",
"selectIdFor1": "stopped",
"statusImageFor2": "http://i.imgur.com/L5c69tb.png",
"statusImageFor1": "http://i.imgur.com/L5c69tb.png",
"statusFor0": "Success",
"selectIdFor0": "Success",
"statusImageFor0": "http://i.imgur.com/ZkAwklS.png"
}, {
"index": 2,
"id": "000ABC0I000000000WQW",
"name": "today_record",
"type": "Oracle",
"statusFor2": "No runs available",
"statusFor1": "No runs available",
"selectIdFor2": "stopped",
"selectIdFor1": "stopped",
"statusImageFor2": "http://i.imgur.com/L5c69tb.png",
"statusImageFor1": "http://i.imgur.com/L5c69tb.png",
"statusFor0": "Success",
"selectIdFor0": "Success",
"statusImageFor0": "http://i.imgur.com/ZkAwklS.png"
}];
$scope.taskDetailTableParams = new ngTableParams({
page: 1, // show first page
count: 10, // count per page
sorting: {
index: 'asc' // initial sorting
}
}, {
total: $scope.taskDetailData.length, // length of data
getData: function($defer, params) {
var filterData = params.filter() ? $filter('filter')($scope.taskDetailData, params.filter()) : $scope.taskDetailData;
var orderedData = params.sorting() ? $filter('orderBy')(filterData, params.orderBy()) : filterData;
var table_data = orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count());
params.total(orderedData.length);
$defer.resolve(table_data);
}
});
/**
* Filter for ngtable (Below 3 functions)
* @return {[type]} [description]
*/
$scope.filterStatus = function(column, id) { // for0 --> moved to id
//console.log(column);
var def = $q.defer(),
arr = [],
filterStatus = [];
angular.forEach($scope.taskDetailData, function(item) {
//console.log(item.selectIdFor0, item['selectIdFor' + id])
if (jQuery.inArray(item['selectIdFor' + id], arr) === -1) {
arr.push(item['selectIdFor' + id]);
filterStatus.push({
'id': item['selectIdFor' + id],
'title': item['statusFor' + id]
});
}
});
filterStatus.sort(function(a, b) {
if (a.id < b.id)
return -1;
if (a.id > b.id)
return 1;
return 0;
});
def.resolve(filterStatus);
return def;
};
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/ng-table/0.3.3/ng-table.min.css" rel="stylesheet" />
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.2/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ng-table/0.3.3/ng-table.min.js"></script>
<script src="https://code.jquery.com/jquery-2.1.4.js"></script>
<div ng-app="main" ng-controller="DemoCtrl">
<script type="text/ng-template" id="aw_ngtable_header.html">
<tr>
<!-- add new row above normal header for last 3 runs colgroup -->
<th ng-repeat="n in [].constructor($columns.length-2) track by $index" colspan="{{lastThree = ($index == $columns.length -3)? 3:''}}">
<span ng-if="lastThree">Last 3 runs</span>
</th>
</tr>
<tr>
<th ng-repeat="column in $columns"
ng-class="{
'sortable': parse(column.sortable),
'sort-asc': params.sorting()[parse(column.sortable)]=='asc',
'sort-desc': params.sorting()[parse(column.sortable)]=='desc'
}"
ng-click="sortBy(column, $event)"
ng-show="column.show(this)"
ng-init="template = column.headerTemplateURL(this)"
class="header {{column.class}}">
<div ng-if="!template" ng-show="!template" ng-bind="parse(column.title)"></div>
<div ng-if="template" ng-show="template"><div ng-include="template"></div></div>
</th>
</tr>
<tr ng-show="show_filter" class="ng-table-filters">
<th ng-repeat="column in $columns" ng-show="column.show(this)" class="filter">
<div ng-repeat="(name, filter) in column.filter">
<div ng-if="column.filterTemplateURL" ng-show="column.filterTemplateURL">
<div ng-include="column.filterTemplateURL"></div>
</div>
<div ng-if="!column.filterTemplateURL" ng-show="!column.filterTemplateURL">
<div ng-include="'ng-table/filters/' + filter + '.html'"></div>
</div>
</div>
</th>
</tr>
</script>
<table ng-table="taskDetailTableParams" template-header="aw_ngtable_header.html" show-filter="true" class="table upgradeTaskDetailTable text-left table-bordered">
<!--<thead>
<th>Task Name</th>
<th>Type of Task</th>
<th colspan="3">Last 3 runs</th>
</thead>-->
<tr ng-repeat="item in $data" height="10px" class="animate" ng-animate="{enter: 'animate-enter', leave: 'animate-leave'}">
<td data-title="'Task Name'" class="text-left col-sm-4 col-md-4 col-lg-4" header-class="text-left" filter="{ 'name': 'text' }" sortable="'name'">{{ item.name }}</td>
<td data-title="'Type of Task'" class="text-left col-sm-2 col-md-2 col-lg-2" header-class="text-left" filter="{ 'type': 'text' }" sortable="'type'">{{item.type}}</td>
<td data-title="'latest Run'" class="text-left col-sm-2 col-md-2 col-lg-2" header-class="text-left" filter="{ 'selectIdFor0': 'select' }" sortable="'selectIdFor0'" filter-data="filterStatus($column, 0)">
<img ng-src="{{ item.statusImageFor0 }}" title="{{ item.statusFor0 }}" data-toggle="tooltip" data-placement="bottom" />
</td>
<td data-title="'2nd Latest Run'" class="text-left col-sm-2 col-md-2 col-lg-2" header-class="text-left" filter="{ 'selectIdFor1': 'select' }" sortable="'selectIdFor1'" filter-data="filterStatus($column, 1)">
<img ng-src="{{ item.statusImageFor1 }}" title="{{ item.statusFor1 }}" data-toggle="tooltip" data-placement="bottom" />
</td>
<td data-title="'3rd Latest Run'" class="text-left col-sm-2 col-md-2 col-lg-2" header-class="text-left" filter="{ 'selectIdFor2': 'select' }" sortable="'selectIdFor2'" filter-data="filterStatus($column, 2)">
<img ng-src="{{ item.statusImageFor2 }}" title="{{ item.statusFor2 }}" data-toggle="tooltip" data-placement="bottom" />
</td>
</tr>
</table>
</div>
关于angularjs - Ngtable:需要明确的表头并选择过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32175857/
我正在尝试用 C 语言编写一个使用 gstreamer 的 GTK+ 应用程序。 GTK+ 需要 gtk_main() 来执行。 gstreamer 需要 g_main_loop_run() 来执行。
我已经使用 apt-get 安装了 opencv。我得到了以下版本的opencv2,它工作正常: rover@rover_pi:/usr/lib/arm-linux-gnueabihf $ pytho
我有一个看起来像这样的 View 层次结构(基于其他答案和 Apple 的使用 UIScrollView 的高级 AutoLayout 指南): ScrollView 所需的2 个步骤是: 为 Scr
我尝试安装 udev。 udev 在 ./configure 期间给我一个错误 --exists: command not found configure: error: pkg-config and
我正在使用 SQLite 3。我有一个表,forums,有 150 行,还有一个表,posts,有大约 440 万行。每个帖子都属于一个论坛。 我想从每个论坛中选择最新帖子的时间戳。如果我使用 SEL
使用 go 和以下包: github.com/julienschmidt/httprouter github.com/shwoodard/jsonapi gopkg.in/mgo.v2/bson
The database仅包含 2 个表: 钱包(100 万行) 事务(1500 万行) CockroachDB 19.2.6 在 3 台 Ubuntu 机器上运行 每个 2vCPU 每个 8GB R
我很难理解为什么在下面的代码中直接调用 std::swap() 会导致编译错误,而使用 std::iter_swap 编译却没有任何错误. 来自 iter_swap() versus swap() -
我有一个非常简单的 SELECT *用 WHERE NOT EXISTS 查询条款。 SELECT * FROM "BMAN_TP3"."TT_SPLDR_55E63A28_59358" SELECT
我试图按部分组织我的 .css 文件,我需要从任何文件访问文件组中的任何类。在 Less 中,我可以毫无问题地创建一个包含所有文件导入的主文件,并且每个文件都导入主文件,但在 Sass 中,我收到一个
Microsoft.AspNet.SignalR.Redis 和 StackExchange.Redis.Extensions.Core 在同一个项目中使用。前者需要StackExchange.Red
这个问题在这里已经有了答案: Updating from Rails 4.0 to 4.1 gives sass-rails railties version conflicts (4 个答案) 关
我们有一些使用 Azure DevOps 发布管道部署到的现场服务器。我们已经使用这些发布管道几个月了,没有出现任何问题。今天,我们在下载该项目的工件时开始出现身份验证错误。 部署组中的节点显示在线,
Tip: instead of creating indexes here, run queries in your code – if you're missing any indexes, you
你能解释一下 Elm 下一个声明中的意思吗? (=>) = (,) 我在 Elm architecture tutorial 的例子中找到了它 最佳答案 这是中缀符号。实际上,这定义了一个函数 (=>
我需要一个 .NET 程序集查看器,它可以显示低级详细信息,例如元数据表内容等。 最佳答案 ildasm 是 IL 反汇编程序,具有低级托管元数据 token 信息。安装 Visual Studio
我有两个列表要在 Excel 中进行比较。这是一个很长的列表,我需要一个 excel 函数或 vba 代码来执行此操作。我已经没有想法了,因此转向你: **Old List** A
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
我正在学习 xml 和 xml 处理。我无法很好地理解命名空间的存在。 我了解到命名空间帮助我们在 xml 中分离相同命名的元素。我们不能通过具有相同名称的属性来区分元素吗?为什么命名空间很重要或需要
我搜索了 Azure 文档、各种社区论坛和 google,但没有找到关于需要在公司防火墙上打开哪些端口以允许 Azure 所有组件(blob、sql、compute、bus、publish)的简洁声明
我是一名优秀的程序员,十分优秀!