У меня есть функция в сервисе, которая требует много времени, чтобы вычислить, поэтому я хотел бы показать сообщение о области, чтобы показать ее вычисление. я создал (упрощенный) jsfiddle здесь: http://jsfiddle.net/rikboeykens/brwfw3g9/Угловая область не обновляется при расчете при обслуживании
var app = angular.module('myApp', []);
app.service('testService', function(){
this.longFunction=function(){
for (var i=0; i<1000000000;i++){
}
}
});
function TestCtrl($scope, testService)
{
$scope.$apply(function(){$scope.waiting="not waiting";});
$scope.longFunction = function(){
$scope.waiting="waiting";
testService.longFunction();
$scope.waiting="not waiting";
}
}
longFunction на TestService занимает около двух секунд, чтобы закончить, но $ scope.waiting не обновляется до «ожидания» в то время как это происходит.
Я пробовал использовать $ scope. $ Apply, но тогда я просто получаю сообщение об ошибке: $ apply уже выполняется.
Будет ли он работать, если я буду выполнять longFunction на testService асинхронно? Я изучал использование обещаний, но я не уверен, как я буду реализовывать их.
Поскольку ваша длинная функция является синхронной, нет никакого способа для углового (или любого другого механизма Javascript), чтобы обновить область. Если вы хотите отображать сообщения во время дорогостоящего расчета, async действительно является способом. – doldt
Каждый ответ до сих пор имеет смысл. Как добавленная стоимость, вы можете взглянуть на [этот ответ] (http://stackoverflow.com/questions/23003130/angularjs-show-loading-animation-for-slow-script-eg-while-filtering/23088231 # 23088231), чтобы поддерживать пользовательский интерфейс при выполнении долговременного обслуживания. Кроме того, вы можете посмотреть веб-работников (вероятно, гораздо лучшее решение, но у меня нет опыта в нем). –