【发布时间】:2013-07-18 20:32:52
【问题描述】:
我创建了一个 AngularJS 服务,它动态地将一个 div 插入到 DOM 中,其中包含来自模板的内容和一个处理模板中的绑定和指令的自定义控制器。该服务名为myService,允许您传入templateUrl 和controllerName 作为选项。以下是简化代码:
function display(id, templateUrl, controllerName) {
var scope = $rootScope.$new();
scope.id = id;
var element = angular.element('<div ng-include="\'' + templateUrl + '\'"></div>');
var controller = $controller(controllerName, {$scope: scope});
element.contents().data('$ngControllerController', controller);
$compile(element)(scope);
parentElement.append(elem);
}
我在 DOM 上有一个单独的控制器来处理几个锚标签上的 ng-click:
<a ng-click="handleClick(record.id, record.templateUrl, record.controllerName)">Click Me</a>
我没有使用$routeProvider,并且锚标记上没有 href 和 id 属性。点击函数调用我的自定义服务来渲染 div:
$scope.handleClick = function($event, id, templateUrl, controllerName) {
myService.display(id, templateUrl, controllerName);
};
在 Chrome 浏览器中加载页面后,我向下滚动以显示带有 ng-click 的链接,然后单击该链接,浏览器将滚动到页面顶部。我不希望页面滚动,只需在链接旁边显示 div。该位置的 URL 没有任何变化。如果我向下滚动,我会看到显示的新 div。如果我单击带有ng-click 的不同链接,则不会发生滚动(这也是我第一次单击时想要的)。如果我刷新页面,我首先单击哪个链接并不重要,并且第一次单击总是会导致浏览器滚动回视口的顶部。
如果我没有将ng-include 指令放在我的新元素中,而只是在服务中硬编码模板的HTML,则不会在第一次单击时滚动到页面顶部。
ngInclude documentation 表示您可以指定可选的autoscroll 属性,它表示如果未设置该属性,那么它将“禁用自动滚动”。看来情况并非如此。我尝试将自动滚动设置为“false”,但这没有帮助。
我知道我可以使用$anchorScrollProvider.disableAutoScrolling() 来禁用所有自动滚动,但是我可以做些什么来禁用特定标签的自动滚动?这是我应该报告的 Angular 中的错误吗?如果是这样,在修复该错误之前是否有解决方法?
编辑:这是一个plunk,它演示了这个问题。
【问题讨论】:
标签: angularjs anchor autoscroll angularjs-ng-include angular-services