AngularJS:观察尺寸的最佳方式?

2024-02-06

因此,我对此提出了一些解决方案,但我仍然不太确定什么是最好的。首先供参考,我可以找到一个类似的问题,尽管它有点旧了。这是供稍后阅读本文的任何人使用的:观察 Angular 中的尺寸变化 https://stackoverflow.com/questions/19048985/angularjs-better-way-to-watch-for-height-change

The Goal

我的应用程序中有一些部分需要响应式高度元素。我想要以最快、最具视觉吸引力的方式在 UI/指令层执行此操作,而不需要显式广播更改事件。

选项一:指令

一个简单的指令可以记录每个摘要循环的尺寸(和调整大小事件)

return {
  scope: {
    size: '=ngSize'
  },
  link: function($scope, element, attrs) {

    var windowEl = angular.element($window),
        handler  = function() {
          if ($scope.size &&
              element.outerWidth() === $scope.size.width &&
              element.outerHeight() === $scope.size.height) return false;
          $scope.size = {
            width: element.outerWidth(),
            height: element.outerHeight()
          };
        };

    windowEl.on('resize', function() {
      $scope.$apply(handler);
    });

    $root.$watch(function() { return [element.outerWidth(), element.outerHeight()] }, handler, true);

  }
};

Problem:这种变化传播得不够快,视觉滞后很明显。

解决方案:使用间隔调用


选项二:$interval

我用 $interval 调用尝试了同样的事情,它起作用了,但 CPU 使用率出人意料地高,即使在我反转控制并跟踪按值监视的简单根集合中的元素之后(避免由指令的多个实例产生并发计时器) )。

除了我的环境中一些与 GC 相关的问题(我目前没有看到任何表明这一点的问题)之外,是否有更好的方法来创建这种流体布局?

提议的解决方案/问题

我的第一个想法是创建一个并发的 $digest 循环,以有效地监控整个 DOM 的任何视觉变化。是否可以有效地迭代所有计算样式,例如,生成可以按值监视的廉价哈希值?每次添加和/或更改相关的计算样式时都可以相对便宜地触发某些东西?

在我构建和分析它之前,有人可以评论一下它是否现实,或者首先抽象/重构调整大小触发器是否更有意义?

关于实现此目标的首选方式的任何其他想法1.2.9?

[edit] 另一个可能更简单的问题:是否有可能通过 Javascript 以计算高效的方式提供 1-200 毫秒的实际刷新率?如果是这样,那是 Angular 的 $interval,还是“VanillaJS”实现会更有效?


不幸的是,这个问题并没有得到我希望的那么多关注......而且我没有时间写一个包含背景、分析器屏幕截图等的详细解释。但我确实找到了一个解决方案,我希望这会有所帮助其他人正在处理同样的问题。


结论

任何实际中大型应用程序中的 $digest 循环都无法处理 100 毫秒的刷新。

鉴于要求setInterval我只是完全绕过了循环,而是选择仅在检测到不同维度时广播状态更改(使用offsetWidth/Height原生属性)。

以 100ms 的间隔运行一个$root范围清单给出了我测试过的所有测试的最佳结果,在我的 2.4Ghz i7 2013 MBP 上大约有 10.2% 的活动选项卡 CPU——相比之下,大约 84% 的活动选项卡 CPU 是可以接受的$interval.

欢迎任何评论和批评,否则,这里是独立的指令!显然,您可以通过范围和/或属性来发挥创意来自定义观察者,但为了保持主题不变,我尝试省略任何多余的代码。

对于具有线性复杂度的 N 个元素,它将监视元素的大小变化并将其绑定到您选择的范围属性。我不能保证这是最快/最好的方法,但它是我可以快速开发的最快的实现,可以跟踪与状态无关的 DOM 级维度变化:

app.directive('ngSize', ['$rootScope', function($root) {
  return {
    scope: {
        size: '=ngSize'
    },
    link: function($scope, element, attrs) {

        $root.ngSizeDimensions  = (angular.isArray($root.ngSizeDimensions)) ? $root.ngSizeDimensions : [];
        $root.ngSizeWatch       = (angular.isArray($root.ngSizeWatch)) ? $root.ngSizeWatch : [];

        var handler = function() {
            angular.forEach($root.ngSizeWatch, function(el, i) {
                // Dimensions Not Equal?
                if ($root.ngSizeDimensions[i][0] != el.offsetWidth || $root.ngSizeDimensions[i][1] != el.offsetHeight) {
                    // Update Them
                    $root.ngSizeDimensions[i] = [el.offsetWidth, el.offsetHeight];
                    // Update Scope?
                    $root.$broadcast('size::changed', i);
                }
            });
        };

        // Add Element to Chain?
        var exists = false;
        angular.forEach($root.ngSizeWatch, function(el, i) { if (el === element[0]) exists = i });

        // Ok.
        if (exists === false) {
            $root.ngSizeWatch.push(element[0]);
            $root.ngSizeDimensions.push([element[0].offsetWidth, element[0].offsetHeight]);
            exists = $root.ngSizeWatch.length-1;
        }

        // Update Scope?
        $scope.$on('size::changed', function(event, i) {
            // Relevant to the element attached to *this* directive
            if (i === exists) {
                $scope.size = {
                    width: $root.ngSizeDimensions[i][0],
                    height: $root.ngSizeDimensions[i][1]
                };
            }
        });

        // Refresh: 100ms
        if (!window.ngSizeHandler) window.ngSizeHandler = setInterval(handler, 100);

        // Window Resize?
        // angular.element(window).on('resize', handler);

    }
  };
}]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS:观察尺寸的最佳方式? 的相关文章

  • 如果 CSS 是渲染阻塞的,为什么我们会看到 FOUC?

    为了构建渲染树 浏览器需要 DOM 和 CSSOM CSSOM 只有在下载 CSS 后才能构建 本质上 一旦下载了 CSS 页面就应该可以正常渲染了 但是 为什么我们会在页面上看到 Flash Of Unstyled Content FOU
  • Angular UI-Router:多个 URL 到单一状态

    我已经开始使用 Angular 的 ui router 并且我正在尝试弄清楚如何让多个 URL 引用单个状态 例如 orgs 12354 overview retyrns the same pages as org overview 我的
  • 节点 sass 无效 CSS

    node sass 是否支持 use 由于我收到此错误 SassError t family fonts 之后的 CSS 无效 预期的表达式 例如 1px 粗体 为 roboto 这是 Nav scss 的代码 nav width 100
  • 只保留 A-Z 0-9 并使用 javascript 从字符串中删除其他字符

    我正在尝试验证字符串以使它们成为有效的网址 我只需要保留 A Z 0 9 并使用以下命令从字符串中删除其他字符javascript or jquery 例如 贝儿餐厅 我需要将其转换为 百丽餐厅 所以字符被删除 只保留 A Z a z 0
  • 对使用“new”创建的数组上“map”的行为感到困惑[重复]

    这个问题在这里已经有答案了 我对结果感到困惑mapping 使用创建的数组new function returnsFourteen return 14 var a new Array 4 gt undefined x 4 in Chrome
  • 使用 Javascript/Node.js 在代码内执行 mongoimport

    node js javascript 中是否有任何库可供个人使用mongoimport在代码中 据我了解 mongoimport 有点像 exe 您必须先执行它 然后才能使用其文本输入环境 是否可以在我的代码中执行 mongoimport
  • IE localStorage 事件失火

    在 Internet Explorer 9 和 10 中 localStorage 实现意外地触发事件 这里有很棒的线索 Chrome 的 localStorage 实现存在错误 https stackoverflow com questi
  • 如何在打字稿中使用外部js

    我通过 Typescript 代码生成 Angular JS 代码 在一种情况下 我需要将外部 JS 文件添加到我的打字稿文件中 并且需要访问 js 文件中的类 我像这样添加js文件
  • 在 javascript 中实现固定位置会导致 Safari 滚动时出现抖动

    固定位置不适用于我的用例 因为它固定在浏览器窗口上 您可能会处于文本在屏幕右侧之外且无法到达的状态 无论如何 我尝试使用绝对定位 然后调整javascript中的 顶部 它在 Firefox 和 Chrome 中运行良好 但在 Safari
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • 在“onClick”上切换 DIV 高度

    我想切换分区的高度 我尝试过将 animate 与 if else 语句一起使用 但它只会反弹 我现在使用的代码将隐藏我的分区而不是切换高度 点击时会触发 document ready function content1 toggle fu
  • Sphinx内联代码高亮

    我使用 Sphinx 制作一个包含代码示例的网站 我成功地使用了 code block获取语 法高亮的指令 但我无法使用此代码获得内联语法突出显示 role bash code language bash Test inline bash
  • 居中

    我的问题 http i56 tinypic com ff3jmo png http i56 tinypic com ff3jmo png 项目符号点未对齐 我要做的只是 text align center ing ul 所在的类 我可以对齐
  • 如何使用 Javascript 在 html 文件中搜索字符串?

    我有 5 个 html 文件 并且有一个搜索表单 我想用它来搜索这些 html 文件中的文本
  • 删除下拉链接并在导航栏菜单中显示其所有项目

    我正在使用 Twitter Bootstrap 及其响应式设计来实现顶部典型的 Twitter Bootstrap 导航栏菜单 在那里我有一些链接和一个下拉菜单 当我将浏览器大小调整为768px或者更少 它会转变为一种新的导航菜单 这一切开
  • 离子初始加载时间

    我正在使用 Ionic 构建一个简单的应用程序 但我的应用程序在冷启动时的初始加载时间方面存在性能问题 这是我所做的 collection repeat 代替带有 track by 的 ng repeat 原生滚动 overflow scr
  • 如果 jquery 验证激活,如何在单选按钮中放置红色边框[重复]

    这个问题在这里已经有答案了 我的问题是 如果 jquery 验证像示例图片中那样激活 我无法使单选按钮具有红色边框 任何人都可以帮我解决这个问题吗 http i38 photobucket com albums e149 eloginko
  • 如何在 AngularJS 中测试具有解析属性的控制器?

    如何测试具有解析属性的控制器 它会抛出一个错误 未知提供者 InitProvider 在测试期间 这是可以理解的 我该如何测试它 我使用路由配置中的 init 属性来加载数据 并在控制器实例化时将其传递给控制器 以便在加载数据之前路由不会更
  • highchart堆积柱每个类别的总数据

    我想获取每个类别的总数据 这point stackTotal只给出活动数据的总数 从我粘贴的代码示例中 我想知道每种水果的总消耗量 因此 即使我单击右上角图例上的乔的名字 这使得堆叠图表上的所有乔信息都处于非活动状态 我仍然可以知道约翰 简
  • Typescript 中的 Angular 服务具有依赖注入和缩小功能

    我现在正在努力让我的头脑围绕 Angularjs 我目前正在寻找服务 我也使用打字稿来编写代码 现在 从网络上的示例中 我看到人们在打字稿中使用如下所示的服务 class Service constructor private http n

随机推荐

  • C++ 无法计算包含向量大小的公式?

    int main vector
  • Visual Studio 使用标准格式复制/粘贴到 Outlook 中?

    我在 Visual Studio 中有包含深色背景的自定义设置 复制 粘贴到 Outlook 会对邮件的白色背景上的代码中的深色背景产生视觉犯罪 有谁知道如何以标准和格式粘贴代码 不是特殊粘贴中的未格式化文本 也不使用我的自定义 VS 格式
  • 如何在滚动运算符中访问多列?

    我想在 pandas 中进行一些滚动窗口计算 需要同时处理两列 我举一个简单的例子来清楚地表达问题 import pandas as pd df pd DataFrame x 1 2 3 2 1 5 4 6 7 9 y 4 3 4 6 5
  • Django 多对多模型 DRF

    我有以下模型结构 class Project models Model author models ManyToManyField Account name models CharField max length 40 default Ne
  • 如何在View和ViewModel之间传递数据

    我是 MVVM 设计模式的新手 我正在尝试创建一个简单的应用程序 其中主窗口中显示学生列表 我希望用户能够将新学生添加到我已完成的列表中绑定学生数据所在的可观察集合 但如何通过从文本框中获取数据并将其用作命令中的参数来创建新用户 这是我的观
  • 如何测试飞行路线迁移?

    通常迁移脚本很简单 例如添加新列等 如果应用程序已部署 则一切正常 但有时需要测试一些复杂的逻辑 推荐的方法是什么 有一个单独的数据库用于测试 将其作为每个构建的一部分进行迁移 并针对它运行测试 您还可以根据需要添加额外的测试数据 包括用于
  • Laravel Sanctum 可以使用 Multiauth 防护

    我正在用 laravel sainttum 进行测试 但这里有一些问题 我正在创建管理员警卫 当我将中间件更改为 auth sanctum admin 它应该只能由管理员访问 但在这里我可以使用带有网络防护的普通用户帐户进行访问 我不知道为
  • 有没有一种方法可以创建一个 pandas 数据框,其行是整数,这些整数会增加直到每行达到某个值?

    例如 假设我有整数数组 5 3 7 6 4 我希望找到一种有效的方法来创建如下所示的 pandas 数据框 数据帧中的第一行应包含数字 1 到 5 第二行应包含数字 1 到 3 依此类推 有没有办法在不循环的情况下实现这一目标 一个简单的单
  • 将枚举值传递给 PowerShell 中的函数

    我有一个接受枚举值作为参数的函数 举个例子 考虑一下这样的事情 PS gt function IsItFriday System DayOfWeek dayOfWeek if dayOfWeek eq System DayOfWeek Fr
  • SQL 行之间的差异

    我有一个像这样的 SQL 2008 数据库表 name score steve 207 steve 205 steve 200 steve 139 我想得到行之间的差异 eqn 行 行 1 所以我理想地希望它是 steve 2 207 20
  • 如何编写 Nexus Rest Api 的 Get 方法?

    I have groupId artifactId and version 如何使用 Nexus Rest API 编写 GET 请求以获得进一步的工件描述 不确定您要查找什么信息 REST API 文档可在此处获取 Core API ht
  • 如何在 Xamarin Forms 中获取设备的 GPS 位置?

    我想在输入框名为时获取我的设备的经度和纬度实体位置 is focused 我在用Xamarin Essential 地理定位为了获取我的设备的 GPS 位置 我按照文档和教程进行操作 但仍然无法获取 GPS 位置 我已经在我的 Androi
  • 如何在 Android webview 中打开 Microsoft Teams 会议

    我正在尝试在 Web 视图中打开 Microsoft Teams 会议 当我在 Web 视图中打开会议网址时 它开始寻找 MS Teams 应用程序 这是我不想要的 我只想在 Web 视图中参加会议 请帮助我在 Android 应用程序的
  • 包括 ionic 2/Angular 2 的通用标题栏

    我有一个 ionic 2 标题栏 其中包含主页或注销按钮和公司标志这对于所有页面都是通用的 我如何编写一个通用函数 Injectable 这样就可以很容易地包含在所有页面中 而不是重复代码
  • Protractor + AngularJS + Jasmine 在xml文件上获取输出结果

    我正在尝试将量角器结果导出到 xml 文件 我在网上找到了这个很棒的链接 https github com angular protractor issues 60 https github com angular protractor i
  • QMessageBox 带有“不再显示”复选框

    如何显示下面带有 不再显示 复选框的消息框 我想象的东西看起来像这样 Qt 5 2 添加了添加QCheckBox to a QMessageBox 看一下QMessageBox setCheckbox http doc qt io qt 5
  • 同时在 iPhone 和模拟器上进行多点连接测试

    您好 我正在论坛的所有主题中搜索有关如何测试使用多点连接框架的应用程序的信息 有人可以告诉我如何同时使用 iPhone 设备和模拟器 设备上的播放器一和模拟器上的播放器二 来测试应用程序 反之亦然 我已经通过使用两个模拟器 每个 mac 一
  • Stack (Haskell) 使用 GitHub Actions 构建源文件的缓存

    当使用本地构建我的 Haskell 项目时stack build 仅重新编译更改的源文件 不幸的是 我无法让 Stack 在 GitHub Actions 上表现得像这样 请问有什么建议吗 Example 我创建了一个简单的例子Lib hs
  • 从根目录提供主页和静态内容

    在 Golang 中 如何在根目录之外提供静态内容 同时仍然拥有用于提供主页的根目录处理程序 使用以下简单的 Web 服务器作为示例 package main import fmt net http func main http Handl
  • AngularJS:观察尺寸的最佳方式?

    因此 我对此提出了一些解决方案 但我仍然不太确定什么是最好的 首先供参考 我可以找到一个类似的问题 尽管它有点旧了 这是供稍后阅读本文的任何人使用的 观察 Angular 中的尺寸变化 https stackoverflow com que