我想触发List的第一个li的点击。我正在使用ng-repeat填充List.I知道可以使用指令完成但不知道如何操作。
HTML:
<ul id="my-ul" click-first-row>
<li ng-repeat="row in rows" ng-click="getRow(row,$index)" >{{row.requestId}}</li>
</ul>
JS:
angular.module('App',[]).controller('Ctr',function($scope){
$scope.rows = res.inboxNewRecords;
angular.element(document.querySelector('#my-ul li')).triggerHandler('click');
$scope.getRow = function(data,index){
$scope.newReq = data;
};
}).directive('clickFirstRow',function(){
return{
restrict:'A',
link:function(scope,el,attr){
console.log(el[0]);
el[0].find('li').triggerHandler('click')
}
};
});
请查找相同的plunker。
答案 0 :(得分:2)
您的代码有几点:
&#34; EL [0]&#34;将返回一个不支持.find()选择器的本机元素。你想找到第一个<li>
并用angular.element包装它,这样就可以在它上面调用triggerHandler()。
此代码会过早触发,点击处理程序在您触发点击之前不会被正确绑定。您可以将其打包在$timeout()
中,或者更好地使用$$postDigest
回调。
工作plunkr:https://plnkr.co/edit/O6BeOEieSdNj3Y3KkAYc?p=preview
scope.$$postDigest(function() {
var firstRow = el.find('li')[0];
angular.element(firstRow).triggerHandler('click');
});
但是,出于您描述的目的,更好的方法是在获得响应后立即将newReq
范围变量绑定到第一行:
$scope.rows = res.inboxNewRecords;
if ($scope.rows && $scope.rows.length > 0) {
$scope.newReq = $scope.rows[0];
}
为什么这样做更适合设置初始值有很多原因:
答案 1 :(得分:1)
我猜你正在寻找一个“默认”选择的选项。
如果是这样,这里是plunkr:https://plnkr.co/edit/szj72Vtzw431EZY52wEL?p=preview
基本上,您必须为控制器中的$scope.newReq
变量设置默认值:
$scope.newReq = $scope.rows[0];
这样做,而不是“黑客”点击事件。这不是解决这个问题的正确方法。
答案 2 :(得分:0)
首先,请不要从控制器访问DOM。
然后,我想你可能想要触发第一行的getRow函数&#34;而不是&#34;在第一行触发点击&#34;。这真的不一样。
如果这是你想要实现的目标,可以这样做:
angular
.module('App',[])
.controller('Ctr', function($scope, $http) {
// launch http request from controller even tho
// it'd probably be a better idea to handle it from a service
$http
.get('http://your-backend-url-to-get-inbox')
.then(function(res) {
$scope.rows = res.data.inboxNewRecords;
if (typeof $scope.rows[0] !== 'undefined') {
$scope.getRow($scope.rows[0], 0);
}
});
$scope.getRow = function(row, index){
$scope.newReq = data;
};
});