Angularjs 转到已筛选ng重复元素的位置
我有一个ng repeat元素的列表,这些元素根据范围中的布尔变量进行过滤 HTML: 在我的控制器中:Angularjs 转到已筛选ng重复元素的位置,angularjs,angularjs-ng-repeat,Angularjs,Angularjs Ng Repeat,我有一个ng repeat元素的列表,这些元素根据范围中的布尔变量进行过滤 HTML: 在我的控制器中: $scope.sections = [false, false, false]; $scope.toggleSection = function(n) { $scope.sections[n] = $scope.sections[n] ? false : true; } 但是,我希望相同的toggleSection函数转到它显示的元素的位置,如 $scope.toggleSecti
$scope.sections = [false, false, false];
$scope.toggleSection = function(n) {
$scope.sections[n] = $scope.sections[n] ? false : true;
}
但是,我希望相同的toggleSection函数转到它显示的元素的位置,如
$scope.toggleSection = function(n) {
$scope.sections[n] = $scope.sections[n] ? false : true;
window.scrollTo($("#" + n).position().top, 0);
}
但是我不能这样做,因为DOM需要时间来显示它正在创建的部分。在此之前,元素(及其位置)不存在
设置一个超时可能会起作用,但这似乎很草率
我怀疑我需要创建某种回调或承诺。是这样吗?自定义指令、承诺或其他任何东西,如果您的操作(滚动)依赖于DOM(它确实如此),您将不可避免地在一个角度摘要周期后执行它 因此,实现这一点的短方法实际上是超时:
$scope.toggleSection = function(n) {
$scope.sections[n] = $scope.sections[n] ? false : true;
$timeout(function() {
window.scrollTo($("#" + n).position().top, 0);
}, 0, false);
}
请注意,$timeout
的第三个参数为false:这是因为您不需要在超时后$apply
范围(运行另一个摘要循环)执行其回调,因为它只是jQuery
同样,在更新DOM之前滚动对浏览器没有意义,因此您无法避免它(但您可以隐藏它)。我认为您需要的是一个自定义指令,它将在窗口呈现列表中的元素时滚动窗口。或者广播一个你能听到的事件。
$scope.toggleSection = function(n) {
$scope.sections[n] = $scope.sections[n] ? false : true;
window.scrollTo($("#" + n).position().top, 0);
}
$scope.toggleSection = function(n) {
$scope.sections[n] = $scope.sections[n] ? false : true;
$timeout(function() {
window.scrollTo($("#" + n).position().top, 0);
}, 0, false);
}