2013-05-03 3 views
10

Я просто получаю данные json от служб в контроллере.

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

//JSON file 
{ 
"pc":"name" 
} 

// angular services 
var service = angular.module('Services', ['ngResource']). 
factory('Widgets', function($resource){ 
    return $resource('/json/home.json', {}, { 
     query: {method:'GET', params:{}, isArray:false} 
    }); 
}); 

//controller 
function editWidget($scope, Widgets) { 
$scope.data = Widgets.query(function(data) { 
    alert("Success Data Loaded ---> " + JSON.stringify(data.pc)); 
}); 
} 
+1

Там нет ничего плохого в этом коде - ваша проблема должна находиться в другом месте. Обычно вы получаете это сообщение об ошибке, когда вы выполняете '$ scope. $ Apply (...)' – joakimbl

+0

Не срабатывает ли предупреждение? Как насчет использования console.log, чтобы увидеть значение json, если предупреждение дает вам проблему? – BoxerBucks

+0

@BoxerBucks да, когда я использую console.log, он не бросает ошибку. но я просто хотел узнать причину ошибки. –

ответ

12

alert, а также confirm и prompt приостановит выполнение кода (блокирует нить), в течение которого ауты и интервалы идут все, если они должны были срабатывать во время паузы. Цикл $digest состоит из двух меньших петель, которые обрабатывают очередь $evalAsync и список $watch. Очередь $evalAsync используется для планирования работы, которая должна выполняться вне текущего фрейма стека, но перед визуализацией браузера. Обычно это делается с setTimeout(0). Ваше предупреждение в течение этого времени вызывает проблему.

+0

Это определенно проблема, но есть ли решение, выходящее за рамки без предупреждения? – RAC

+0

Используйте неблокирующие оповещения (модальные). вы можете даже переопределить window.alert, чтобы вызвать ваш модальный. Вы также можете создавать модальные предупреждения и выглядеть лучше, чем собственные оповещения. – TheSharpieOne

10

Вы можете использовать $ timeout для выполнения предупреждения после выполнения цикла дайджест и таким образом избежать этой ошибки.

$timeout(function() { 
    alert('Alert text'); 
}); 

Также не забывайте вводить $ таймаут в вашу директиву

0
if(!confirm('Your message')){ 
    return false; 
}else { 
    return false; 
} 

Возвращение ложного в обоих случаях.

-2

@ TheSharpieOne прав, это работа для меня.

function delayalert(messagestr){ 
 
      setTimeout(function(){ 
 
       alert(messagestr); 
 
      },0); 
 
}

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