Функция углового прогона, а затем применить

0

Я выполняю большую задачу в контроллере в угловом режиме, и у меня есть наблюдатели, которые могут быть вызваны между выполнением кода и из-за повышения производительности. Я не хочу, чтобы это произошло.

Как я мог избежать углового запуска некоторого наблюдателя во время работы кода? Это уже обработано внутри Угловой магии? Может ли это быть разрешено с помощью $ q, или есть лучший способ сделать это?

Пример:

$scope.variableThatKeepsChanging = {};

function someVeryLongFuntion(){
  var someVar = variableThatKeepsChanging;
  (...);
}

$scope.clickedFn = function () {
  //Here should start someVeryLongFuntion()
  someVeryLongFuntion();
  //Only now should be run the $apply() function of angular 
}

//NOTE: I need the watcher to catch changes not done by someVeryLongFuntion()
$scope.$watch('variableThatKeepsChanging', function () {doSomething()});

Спасибо.

  • 3
    тогда не смотри
  • 0
    Мне нужен наблюдатель из-за сборки моего приложения, вопрос в том, есть ли способ остановить дайджест и выполнить, когда вы хотите через некоторое время
Показать ещё 1 комментарий
Теги:
asynchronous

3 ответа

0

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

Подробнее о цикле событий Javascript и угловом $ digest и $ применяются, чтобы понять это.

https://docs.angularjs.org/guide/scope (интеграция с циклом событий браузера)

0

Вы можете попробовать поставить его в $timeout с 0 таймаутом

$timeout(function(
    someVeryLongFunction();
), 0, false);

Взгляните на третий параметр в службе $timeout, он не должен вызывать $apply(), но вам нужно будет позвонить потом самостоятельно

0

в вашем случае я чувствую, что вместо наблюдателя вам может понадобиться $emit или $broadcast, поэтому у вас есть прямой контроль при отправке события.

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

есть функция добавления наблюдателя:

var addWatcher = function(name){
return $scope.$watch(name...)
}

если вы хотите, чтобы наблюдатель делал что-то, просто добавлял обратный вызов наблюдателю, чтобы он что-то делал; назовите его:

var mywatcher = addWatcher('scopeName');

для отключения вызова наблюдателя:

myWatcher();

что-то вроде того

Ещё вопросы

Сообщество Overcoder
Наверх
Меню