我目前正在构建Chrome扩展程序。 Chrome的政策是不允许使用内联JS事件处理程序,因此我正在寻找一种为ng-repeat元素创建事件侦听器的方法。
我尝试根据我传递给ng-repeat的数据集生成事件处理程序,因为我知道模板我已经能够生成相应的ID,但是我似乎无法正确计时,因此只有在ng-repeat完成更新DOM之后才设置事件监听器。
我目前的代码如下:
app.controller('commentsCtrl', function($scope) {
$scope.data = datalayer;
//console.log($scope.data);
document.addEventListener('DOMContentLoaded', function(){
for (var i = 0; i < datalayer.comments.length; i++){
var id = datalayer.comments[i].id + "_replybutton";
console.log(id);
var div = document.getElementById(id);
console.log(div);
console.log(datalayer.sc);
}
});
});
x_replybutton是我想为其创建侦听器的按钮的id格式。目前,我可以在重复部分加载后让上面的代码在控制台中正常工作,但是当我将它添加到控制器时它不会运行。
任何想法或建议都会非常感激。
答案 0 :(得分:1)
您的datalayer
变量来自哪里?你不应该使用
控制器或服务中的全局变量,但注入你需要的东西。
我认为datalayer
设置为$scope.data
时没有值,
但更像是Promise
这在某些时候得到解决,可能是由
$http.get某个地方?
如果是这种情况,(暂时忽略你应该在注入的服务中产生值) 你可以做到
app.controller('commentsCtrl', function($scope, $timeout) {
datalayer.then((datalayer) => {
$scope.data = datalayer;
$timeout(()=>{
for (var i = 0; i < datalayer.comments.length; i++){
var id = datalayer.comments[i].id + "_replybutton";
var div = document.getElementById(id);
div.addEventListener('click', function() {
console.log('clicked');
});
}
}, 0);
})
}
$timeout(()=>{ <code here> }, 0)
将使您的代码等待执行,直到Angular完成
渲染DOM(实际上是在堆栈清除后让JavaScript执行代码)。
答案 1 :(得分:0)
Chrome安全策略允许显示ng-click。 https://developer.chrome.com/apps/angular_framework