【问题标题】:Reduce lag in angularjs UI减少 angularjs UI 中的延迟
【发布时间】:2014-03-07 17:17:14
【问题描述】:

我正在尝试实现(或更确切地说是改进)使用角度指令制作的滑块。 滑块的结构如下:

  • div
    • 带有可拖动滑块的div(左:百分比)
    • 带有进度条区域的div(宽度:百分比)
  • div
    • 带有验证的输入框显示值(在本例中为百分比)

其中一个滑块还调用服务器函数来查看某个日期是否可用,并在输入字段中显示下一个可用日期。 屏幕的另一部分动态显示所有这些滑块的所有值。

我希望滑块部分和进度区域能够立即更新,而不仅仅是在 scope.$apply 上。其他依赖项和验证可以稍后更新。

要获取滑块值,我会在鼠标拖动和鼠标单击时进行监听,并将鼠标事件 X 位置与滑块边界框进行比较,计算百分比并将其设置为应用于模板的范围。

当没有任何东西与范围值耦合时,上面的工作非常快,但是一旦我开始添加观察者,它就会变得非常慢。

我尝试直接设置 css,但在应用范围之前没有应用:

link:....
  var sliderDiv = element.find('.slider-handle');
  var progressDiv = element.find('.progress-bar');

updateSlider().....
  sliderDiv.css('left', ''+percent+'%');
  progressDiv.css('width', ''+percent+'%');

这是使用正确的模式吗?

我需要对字段进行验证,有选择地启用或禁用某些内容,将滑块绑定到可以更改的值。

CSS/DOM 操作能否立即应用在 Angular 指令中?

我尝试的所有内容只有在“消化”范围时才会应用。我知道这是一种反模式,但我愿意做出权衡。

** 至少可以让 Angular 部分使用范围吗? **

我尝试只为滑块设置一个单独的值,并且只将该值应用于范围,但它似乎不起作用,范围似乎只被使用一次。

        scope.$apply(new function(){
          scope.tempValue = value;
        });

使用 $timeout 或 _.debounce 或 _.throttle 并没有产生任何结果,它只会让感知到的性能更差。

【问题讨论】:

    标签: jquery css angularjs


    【解决方案1】:

    我不确定这是否能解决您遇到的确切问题(可能与此处未提供的代码有关),但我在尝试使用 Angular 实现滑块时遇到了类似的问题。

    为了解决这个问题,我最终编写了自己的代码 (sliderBar.js),然后按如下方式实现(仅示例):

    // whatever your controller is
    myApp.controller('myController', ['$scope', function($scope) {        
      // wait for the document to be ready
      angular.element(document).ready(function () {
         // define scope variable
         $scope.sliderVal=0;
         // create slider
         $('#elementToMakeSlider').sliderBar({  
           // define change event of slider
           onChange:function(value){
             // apply slider value to scope
             $scope.sliderVal=val;
           }
         });
      });    
    }]);
    

    根据您的代码/要求的性质,您可能需要包装 onChange 函数内容:

         $('#elementToMakeSlider').sliderBar({  
           onChange:function(value){
             $timeout(function() {
               $scope.sliderVal=val;
             });
           }
         });
    

    【讨论】:

    • 谢谢,我已经尝试过了,但它使 UI 看起来很迟钝,因为它将所有请求排队,然后消化它们。因此,如果您快速来回移动滑块然后停止,输入字段会在一段时间内赶上更新。理想情况下,它们应该只显示最后一次更新,就像 debounce 一样,除非我不能在不调用 $timeout 的情况下使用 debounce。
    • 如果您查看滑块的方法 - 有一个 onSet 仅在滑块完成更改时触发。您可以使用它来设置范围变量和 onChange 方法来进行任何 GUI 更新,这将阻止 Angular 被不必要的摘要项淹没。
    • 这可以解决问题,但客户希望更新可见,我认为这也是很好的 UI 实践。我添加了一个 300 毫秒的去抖动功能,它可以完成这项工作,但仍然不行,因为一旦验证/更新了字段,它也会减慢 UI 的快速更新。
    • 我将您的答案设置为已接受,因为没有其他人就此提供任何建议,该建议适用于稍后阅读此内容的任何人。我仍在寻找一种无需强制更新 CSS/DOM 的方法到 $digest 的东西,但现在就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2019-12-12
    • 1970-01-01
    • 2018-10-31
    相关资源
    最近更新 更多