Я выполняю большую задачу в контроллере в угловом режиме, и у меня есть наблюдатели, которые могут быть вызваны между выполнением кода и из-за повышения производительности. Я не хочу, чтобы это произошло.
Как я мог избежать углового запуска некоторого наблюдателя во время работы кода? Это уже обработано внутри Угловой магии? Может ли это быть разрешено с помощью $ 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()});
Спасибо.
Javascript не выполняет задачи в паралели, а поскольку угловая часть приложения - это то, что также работает под Javascript, то вам не нужно беспокоиться об этом, потому что наблюдатели не будут запускаться до конца функции, вы выполняете.
Подробнее о цикле событий Javascript и угловом $ digest и $ применяются, чтобы понять это.
https://docs.angularjs.org/guide/scope (интеграция с циклом событий браузера)
Вы можете попробовать поставить его в $timeout
с 0
таймаутом
$timeout(function(
someVeryLongFunction();
), 0, false);
Взгляните на третий параметр в службе $timeout
, он не должен вызывать $apply()
, но вам нужно будет позвонить потом самостоятельно
в вашем случае я чувствую, что вместо наблюдателя вам может понадобиться $emit
или $broadcast
, поэтому у вас есть прямой контроль при отправке события.
но да, вы можете отвязать и переустановить наблюдателей... хотя их переключение довольно необычно и не является такой замечательной практикой
есть функция добавления наблюдателя:
var addWatcher = function(name){
return $scope.$watch(name...)
}
если вы хотите, чтобы наблюдатель делал что-то, просто добавлял обратный вызов наблюдателю, чтобы он что-то делал; назовите его:
var mywatcher = addWatcher('scopeName');
для отключения вызова наблюдателя:
myWatcher();
что-то вроде того