2015-05-13 2 views
2

У меня есть директива, которая добавляет «фиксированный» класс по:

ng-class='{ "fixed": fixed }' 

Эта директива имеет следующую функцию:

angular.element($window) 
    .on('scroll', function() { 
    if (this.pageYOffset >= 480) { 
     if (!scope.fixed) { 
     scope.fixed = true; 
     scope.$apply(); 
     } 
    } else { 
     if (scope.fixed) { 
     scope.fixed = false; 
     scope.$apply(); 
     } 
    } 
    }); 

Мои вопрос в том, я должен применить scope.$apply(), как это, так что это срабатывает только когда мои изменения переменных, или это нормально, просто написать:

angular.element($window) 
    .on('scroll', function() { 
    if (this.pageYOffset >= 480) { 
     scope.fixed = true; 
    } else { 
     scope.fixed = false; 
    } 
    scope.$apply(); 
    }); 

Может быть, есть использование scope.$watch, о котором я не знаю?

ответ

3

Это не имеет смысла называть scope.$apply(), если обновление не производится. Поэтому я хотел бы предложить использовать первый подход, который:

angular.element($window) 
    .on('scroll', function() { 
    if (this.pageYOffset >= 480) { 
     if (!scope.fixed) { 
     scope.fixed = true; 
     scope.$apply(); 
     } 
    } else { 
     if (scope.fixed) { 
     scope.fixed = false; 
     scope.$apply(); 
     } 
    } 
    }); 
0

Да. вам необходимо запустить цикл дайджеста вручную. Когда вы изменяете область видимости через события. используя scope.$apply, которые внутренне вызывают цикл дайджеста &, затем обновите все связанные с областью привязки для просмотра.

Простое изменение угловой области снаружи в угловом контексте необходимо будет запустить цикл дайджеста.

  1. Какой подход лучше всего?

Ваш второй способ подходит для меня.

  1. Возможно, есть какое-то использование объема. $ Watch, о котором я не знаю?

Да, вы можете использовать часы, которые будут выполнять грязные проверки & всякий раза, когда значение получает изменить его будет срабатывать функцию. Используя часы, вам не нужно беспокоиться о цикле дайджеста.

Добавление окна часов pageYOffset property, вместо использования scroll event.

Код

$scope.$watch(function(){ return $window.pageYOffset }, function(newVal, oldVal){ 
     if (newVal >= 480) { 
      scope.fixed = true; 
     } else { 
      scope.fixed = false; 
     } 
}); 
+0

Я знаю, что мне нужно запускать область действия. $ Apply, но я спрашиваю, какой способ ее запуска является предпочтительным? – Idefixx

+0

@Idefixx взглянуть на обновленный ответ .. он должен работать .. :) –

0

Конечно, вы не должны дублировать scope.$apply() в каждой if-else ветви, так что ваш второй пример имеет больше смысла. Однако вы можете упростить его дальше:

angular.element($window).on('scroll', function() { 
    scope.fixed = this.pageYOffset >= 480; 
    scope.$apply(); 
}); 

.. потому что выражение this.pageYOffset >= 480 уже решает true или false.

+0

Не работает область применения. $ Применяется каждый раз, когда пользователь прокручивает бит overkill по производительности? – Idefixx

+0

Да и очень чувствительный. Обычно я использую механизм дроссельной заслонки. – dfsq

+0

Нравится это, например: http: // jsfiddle.сеть/ur5x77g4 / – dfsq

Смежные вопросы