多个监听器与单个人返回每个人都需要的值?

时间:2015-08-24 07:55:35

标签: javascript angularjs events

我很想知道哪一个在性能方面更好; 监听一个事件的侦听器的多个实例,或者一个单例来处理该监听过程,然后只返回其他人使用的值?

示例:

 function one(){
     $window.on('scroll',function(e){
        doOne(e.scrollValue);
     }
 }

 function two(){
     $window.on('scroll',function(e){
        doTwo(e.scrollValue);
     }
 }

 function three(){
     $window.on('scroll',function(e){
        doThree(e.scrollValue);
     }
 }

var getScrollValue = (function(){
  var _scrollValue = 0;
  $window.on('scroll',function(e){
    _scrollValue = e.scrollValue;
  })
  return function() {
    return _scrollValue;
  }
})();

doOne(getScrollValue());
doTwo(getScrollValue());
doThree(getScrollValue());

1 个答案:

答案 0 :(得分:0)

我建议你看看我的个人解决方法:

angular.module('myApp',[])
    .controller('mainCtrl',function($window, $scope){
        $scope.scrollPos = 0;

        $window.onscroll = function(){
            $scope.scrollPos = document.body.scrollTop || document.documentElement.scrollTop || 0;
            $scope.$apply(); //or simply $scope.$digest();

            /* IMPORTANT NOTE : 
             * As $apply() is actully calling $rootScope.$digest() you can
             * directly use $scope.$digest() instead of $scope.$apply() 
             * for better performance depending on context.
             * Long story short : $apply() will always work but force
             * the dirty checking of all scopes that may cause 
             * perfomance issue. 
             */
        };
    });

工作JSFiddle here

这里我没有调用任何函数,但您可以根据$scope.scrollPos值轻松地在onscroll中执行此操作。 我认为不设置太多听众是一种更好的做法。