Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 转到已筛选ng重复元素的位置_Angularjs_Angularjs Ng Repeat - Fatal编程技术网

Angularjs 转到已筛选ng重复元素的位置

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

我有一个ng repeat元素的列表,这些元素根据范围中的布尔变量进行过滤

HTML:

在我的控制器中:

$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);
}