angularjs - 在 Angular JS 中,有没有办法在不使用 scope.watch 的情况下监视 DOM 的变化?
问题描述
我正在尝试创建一个 angularjs bootstrap 手风琴,它在打开时将手风琴滚动到顶部。
这些解决方案与我想做的很接近:
- AngularJS / ui-bootstrap 手风琴 - 单击时滚动到活动(打开)手风琴的顶部
- https://www.peterbouda.eu/making-an-angular-ui-bootstrap-accordion-scrolling-to-top-when-opening.html
但是,他们使用超时或范围监视。除非绝对必要,否则我想避免使用这些。
$watch
有没有办法在不使用or的情况下做到这一点setTimeout
?
这是我正在尝试做的事情,这是使用 $watch:https ://plnkr.co/edit/XQpUdrdjqaCGom4L9yIJ
app.directive( 'scrollTop', scrollTop );
function scrollTop() {
return {
restrict: 'A',
link: link
};
}
function link( scope, element ) {
scope.collapsing = false;
var jqElement = $( element) ;
scope.$watch( function() {
return jqElement.find( '.panel-collapse' ).hasClass( 'collapsing' );
}, function( status ) {
if ( scope.collapsing && !status ) {
if ( jqElement.hasClass( 'panel-open' ) ) {
$( 'html,body' ).animate({
scrollTop: jqElement.offset().top - 30
}, 500 );
}
}
scope.collapsing = status;
} );
}
解决方案
该指令可以简化为:1
app.directive( 'scrollTop', function scrollTop($timeout) {
return {
restrict: 'A',
link: postLink
};
function postLink(scope, elem, attrs) {
elem.on("click", function(e) {
if (scope.status.isOpen) {
$timeout(function() {
$( 'html,body' ).animate({
scrollTop: elem.offset().top - 30
}, 500 );
});
}
});
}
})
<uib-accordion>
<div heading="Section Title" is-open="status.isOpen"
ng-repeat="section in vm.sections"
scroll-top
uib-accordion-group>
<uib-accordion-heading>
<div ng-class="{isOpen: vm.isOpen}">
<h3>{{section.sectionTitle}}</h3>
<p>{{section.sectionSubHeader}}</p>
</div>
</uib-accordion-heading>
<div class="clearfix">
<b>Index+1={{$index+1}}</b>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>
</div>
</uib-accordion>
这$timeout
是必要的,因为浏览器需要在计算正确的滚动偏移之前使用新打开和关闭的元素渲染 DOM。
PLNKR 上的DEMO
推荐阅读
- swift - 如何创建具有延迟的 for 循环以每 X 秒显示一条消息?
- python - 为什么 matplotlib.pyplot 在我的图中给了我很多行而不是一个?
- c# - Renci.sshnet 哈希问题
- python-3.x - 在 ASCII 文件中就地替换文本
- c++ - 使用 boost::asio::overlapped_ptr 的代码不能作为等效的 winapi 代码工作
- azure - Azure sql 数据仓库的 dbup?
- tuples - SML 函数作为值
- tensorflow - 图像描述的联邦学习
- android - Android Studio 和 Room - 外键和约束失败
- python - 在图像上使用 opencv 实现鼠标输入