我有一个列表,列表中的每个项目都是可点击的。
我希望每件商品只能点击一次。
一旦有人点击它,它将被禁用或第二次无法点击。
我的代码如下:
<li data-ng-repeat="item in items">
<a id="{{item.id}}" data-ng-click="insertRecord(item.id)" data-ng-controller="addCtrl">
{{item.name}}
</a>
</li>
答案 0 :(得分:1)
flim的答案几乎有效,但由于addCtrl
创建了隔离范围,您需要在控制器包含seenIds
的范围内定义addCtrl
。这是一个有效的解决方案:
HTML:
<div ng-app ng-controller="MainCtrl">
<ul>
<li data-ng-repeat="item in items">
<a id="{{item.id}}" data-ng-controller="addCtrl"
data-ng-click="item.clicked || insertRecord(item.id); item.clicked = true">
{{item.name}}
</a>
</li>
</ul>
</div>
JS:
function MainCtrl($scope) {
$scope.items = [
{id: 1, name: 'foo'},
{id: 2, name: 'bar'}
];
$scope.insertRecord = function(itemId) {
alert(itemId + ' clicked (inserting...)');
};
}
function addCtrl($scope) {
}
答案 1 :(得分:0)
如果要在jQuery中附加单击处理程序,则可以使用.one()
,例如:
$("#whatever").one(insertRecord);//no need to pass a an id as it can be derived within the function
我不确定Angular是否允许你这样做。
答案 2 :(得分:0)
在addCtrl范围内创建一个哈希
$scope.seenIds = {}
您的insertRecord(item.id)将首先检查是否已看到ID。如果有,请不要做任何事情。
$scope.insertRecord = function (id) {
if (typeof $scope.seenIds[id] === "undefined") {
$scope.seenIds[id] = 1;
// do your thing
}
}
他们可以点击他们想要的所有内容,但除了第一次点击外什么都不会发生。