当前位置: 首页 > 面试题库 >

AngularJS:观察高度变化的更好方法

微生曾琪
2023-03-14
问题内容

我遇到了一个旧的可变高度导航问题:position: fixes顶部导航,margin-top: $naviHeight底部导航。异步加载数据时,导航可以更改高度,因此内容的边距也必须随之更改。

我希望这是自给自足的。因此,没有代码在何处加载数据,而仅在涉及的html-elements / directives中。

目前,我正在AngularJS 1.2.0中使用如下计时器进行操作:

/*
* Get notified when height changes and change margin-top
 */
.directive( 'emHeightTarget', function(){
    return {
        link: function( scope, elem, attrs ){

            scope.$on( 'heightchange', function( ev, newHeight ){

                elem.attr( 'style', 'margin-top: ' + (58+newHeight) + 'px' );
            } );
        }
    }
})

/*
* Checks this element periodically for height changes
 */
.directive( 'emHeightSource', ['$timeout', function( $timeout ) {

    return {
        link: function( scope, elem, attrs ){

            function __check(){

                var h = elem.height();

                if( h != scope.__height ){

                    scope.__height = h;
                    scope.$emit( 'heightchange', h );
                }
                $timeout( __check, 1000 );
            }
            __check();
        }
    }

} ] )

这有一个明显的 缺点,那就是使用计时器 (我觉得这很丑陋),并且 在调整导航大小之后 直到内容被移动 之后会有一定的延迟

有一个更好的方法吗?


问题答案:

这通过注册一个emHeightSource名为every
的观察者来工作$digest。它会更新该__height属性,该属性又将在监视emHeightTarget

/*
 * Get notified when height changes and change margin-top
 */
.directive( 'emHeightTarget', function() {
    return {
        link: function( scope, elem, attrs ) {

            scope.$watch( '__height', function( newHeight, oldHeight ) {
                elem.attr( 'style', 'margin-top: ' + (58 + newHeight) + 'px' );
            } );
        }
    }
} )

/*
 * Checks every $digest for height changes
 */
.directive( 'emHeightSource', function() {

    return {
        link: function( scope, elem, attrs ) {

            scope.$watch( function() {
                scope.__height = elem.height();
            } );
        }
    }

} )


 类似资料:
  • 问题内容: 这似乎是一个愚蠢的问题,但是我需要知道如何监视页面的整个DOM并在页面发生任何变化时重新对其进行编译。本质上,这是AngularJS在默认情况下通过使用数据绑定来执行的操作,但是我需要在DOM中的任何内容发生变化时(不仅是绑定)发生这种情况。原因是因为我有一个完全用HTML,Javascript和PHP构建的应用程序。它是一个单页应用程序,具有一个主页,并将PHP注入该页面内的DIV包

  • 问题内容: 一个人如何监视/触发一条路线上的事件? 问题答案: 以下事件也可用(它们的回调函数采用不同的参数): $ routeChangeSuccess $ routeChangeError $ routeUpdate-如果将reloadOnSearch属性设置为false

  • 问题内容: 如何在Angular中使用多个变量,并在其中之一发生更改时触发回调。 问题答案: 更新 Angular现在提供了两种范围方法$ watchGroup (从1.3开始)和$watchCollection。这些已被@blazemonger和@kargold提及。 这应该独立于类型和值而工作: 在这种情况下,您必须将第三个参数设置为true。 在这种情况下,字符串连接将失败: 在用户单击按钮

  • 问题内容: 我知道我可以跑步: 但是我想不出一种方法来监视应用程序中的更改。 问题答案: 在文档中: https //github.com/angular-ui/ui-router/wiki#state-change- events

  • 问题内容: 我想知道是否有什么办法可以在程序运行时观察变量值的变化。当然不使用调试器,我想以 编程方式进行 。例如: 因此,在运行时,如果在我的项目中任何类的任何方法中修改了此value 事件,则应调用该事件。 问题答案: 您需要用一个类替换该类型,该类将在值更改时调用您的侦听器。您可能想忽略未实际更改的值的设置。 例如 您可以使用字节码注入执行此替换,但是更改原始代码非常简单。 一种替代方法是监

  • 我正在从ViewModel中的Dialog片段更新LiveData值,但无法获取片段中的值。 视图模型: BaseViewModel: 对话框片段: 我从DialogFragment的xml文件中调用viewmodel的resendOTP(contactId:String)方法: 现在,每当我尝试从片段中调用resendOTP响应LiveData时,它都不会被调用: 所以我在这里做错了什么。 编辑