以下代码使client.name成为客户端中每个客户端的锚点。我感兴趣的是将整个<tr>
元素作为该链接。 ng-href
不适用于<tr>
元素。我该怎么办才能使整个行都是ng-href
实例化的单个链接?
<tr ng-repeat="client in clients">
<td><a ng-href="#/user/{{client.tagid}}">{{client.firstname}}</a></td>
<td>{{client.lastname}}</td>
<td>{{client.inumber}}</td>
</tr>
我期待的是这样的事情......当然不起作用..
<a ng-href="#/user/{{client.tagid}}">
<tr ng-repeat="client in clients">
<td>{{client.firstname}}</td>
<td>{{client.lastname}}</td>
<td>{{client.inumber}}</td>
</tr>
</a>
OR
<tr ng-repeat="client in clients" ng-href="#/user/{{client.tagid}}">
<td>{{client.firstname}}</td>
<td>{{client.lastname}}</td>
<td>{{client.inumber}}</td>
</tr>
答案 0 :(得分:32)
你可以使用ng-click(而不是onClick),正如Jason所建议的那样。
类似的东西:
<强> HTML 强>
<tr ng-repeat="client in clients" ng-click="showClient(client)">
<td><a ng-href="#/user/{{client.tagid}}">{{client.firstname}}</a></td>
<td>{{client.lastname}}</td>
<td>{{client.inumber}}</td>
</tr>
<强>控制器强>
$scope.showClient = function(client) {
$location.path('#/user/' + client.tagid);
};
使样式化使其显示为可点击的元素(在IE7中不起作用)
<强> CSS 强>
tr {
cursor: pointer;
}
// or
[ng-click] {
cursor: pointer;
}
答案 1 :(得分:11)
我写了一个指令,你可以简单地写:
<tr ng-repeat="client in clients" such-href="#/user/{{client.tagid}}">
来源:
app.directive('suchHref', ['$location', function ($location) {
return{
restrict: 'A',
link: function (scope, element, attr) {
element.attr('style', 'cursor:pointer');
element.on('click', function(){
$location.url(attr.suchHref)
scope.$apply();
});
}
}
}]);
答案 2 :(得分:4)
我使用自己的Angular指令自动用行链接包裹行中的每个单元格。
优点是:
HTML用法:
<tr row-href="#/user/{{client.tagid}}">
<td>...</td>
<td>...</td>
</tr>
指令代码(在TypeSript中):
export class RowHrefDirective implements ng.IDirective {
constructor(private $compile: ng.ICompileService) {
}
restrict = "A";
scope = {
rowHref: "@rowHref"
};
link = (scope: Scope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes): void => {
const cells = element.children("td[skip-href!='yes'],th[skip-href!='yes']");
cells.addClass("cell-link");
for (const cell of cells.toArray()) {
const link = jQuery(`<a ng-href="{{ rowHref }}"></a>`);
this.$compile(link)(scope);
jQuery(cell).prepend(link);
}
}
}
必需的CSS代码(用链接填充整个单元格):
td.cell-link,
th.cell-link {
position: relative;
}
td.cell-link a,
th.cell-link a {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
}
答案 3 :(得分:3)
这是一个CSS和HTML问题,并非特定于AngularJS。 <tr>
唯一允许的子项是<td>
,因此您需要将每个单元格的内容包装在一个锚点中。您还需要使锚点成为块元素,使其成为容器的整个高度/宽度:
<tr ng-repeat="client in clients">
<td>
<a style="display: block;" ng-href="#/user/{{client.tagid}}">
{{client.firstname}}
</a>
</td>
<td>
<a style="display: block;" ng-href="#/user/{{client.tagid}}">
{{client.lastname}}
</a>
</td>
<td>
<a style="display: block;" ng-href="#/user/{{client.tagid}}">
{{client.inumber}}
</a>
</td>
</tr>
答案 4 :(得分:1)
<tr ng-repeat="client in clients" ng-href="#/user/{{client.tagid}}">
<td>{{client.firstname}}</td>
<td>{{client.lastname}}</td>
<td>{{client.inumber}}</td>
</tr>
这是参考提供的可能有用的选项。 我认为这会将整行与行中的每个字段绑定在一起。但不可点击。怎么做。我的意思是我们应该能够点击以便可以打开另一个视图/模块。
答案 5 :(得分:1)
根据@sfs的要求,这是我们用于ui-sref
的解决方案(Angular 1.5; TypeScript代码,对由此造成的不便表示道歉)。
致谢:该代码基于answer的精彩Martin Volek:
import { IDirective, IDirectiveFactory, ICompileService, forEach, element } from 'angular';
export default class RowUiSrefDirective implements IDirective {
restrict = 'A';
scope = { rowUiSref: '@rowUiSref' };
constructor(private $compile: ICompileService) { }
link = (scope, elm, attrs) => {
if (elm[0].tagName !== 'TR') {
throw new Error('This directive should only be used in <tr> elements.');
}
forEach(elm.children(), (cell) => {
if (cell.attributes['skip-href'] && cell.attributes['skip-href'].value !== 'false') {
return;
}
cell.className += ' cell-link';
let link = element('<a ui-sref="{{rowUiSref}}"></a>');
this.$compile(link)(scope);
element(cell).prepend(link);
});
};
static factory(): IDirectiveFactory {
let directive = ($compile: ICompileService) => new RowUiSrefDirective($compile);
directive.$inject = ['$compile'];
return directive;
};
}
指令初始化:
import { module } from 'angular';
import RowUiSrefDirective from './rowUiSref';
module('app').directive('rowUiSref', RowUiSrefDirective.factory());
使用示例:
<table>
<tr ng-repeat="item in itemController.items"
row-ui-sref="state.item({itemId: '{{item.id}}'})">
<td>{{item.name}}</td>
<td>{{item.label}}</td>
</tr>
</table>
答案 6 :(得分:0)
一个丑陋的解决方案是只有一个包含链接的表格单元格,然后在其中添加另一个包含表格行和其他单元格的表格。所以它看起来像;
<tr ng-repeat="client in clients">
<a ng-href="#/user/{{client.tagid}}">
<table>
<tr>
<td>{{client.firstname}}</td>
<td>{{client.lastname}}</td>
<td>{{client.inumber}}</td>
</tr>
</table>
</a>
</tr>
我不同意使用表格进行布局!
但是,您正在使用JavaScript和angularjs,因此您可以将click事件添加到表行,这样就可以通过window.location
将用户发送到URL。例如
<tr ng-repeat="client in clients" ng-click="ChangeLocation([yoururl])">
<td>{{client.firstname}}</td>
<td>{{client.lastname}}</td>
<td>{{client.inumber}}</td>
</tr>
然后在$scope
内设置一个函数来处理这个问题;
$scope.ChangeLocation = function(url){
window.location = url;
}
答案 7 :(得分:0)
试试这个......
HTML ---&gt;
<ul ng-repeat ="item in itemList ">
<li><a data-ng-href="{{getUrl(item)}}">{{item.Name}}</a></li>
</ul>
JS ---&gt;
$scope.getUrl = function (item) {
return '/<give your path here>/' + item.ID;
};
答案 8 :(得分:0)
我改编了 Martin Volek 的 Typescript 代码来制作 AngularJS 1.x 指令:
app.directive('rowHref', function ($compile)
{
return {
restrict: 'A',
link: function (scope, element, attr)
{
scope.rowHref=attr.rowHref;
var cells = element.children("td");
angular.forEach(cells, function (cell)
{
$(cell).addClass("cell-link");
var newElem = angular.element('<a ng-href="{{ rowHref }}"></a>');
$compile(newElem)(scope);
$(cell).append(newElem);
});
}
}
});
添加他相同的 HTML 和 CSS