2013-05-03 5 views
10

Właśnie otrzymuję dane json z usług w kontrolerze.

Używam funkcji oddzwaniania, aby wydrukować wiadomość powodzenia po jej załadowaniu. To działa dobrze, ale jest również rzucanie błąd o którym wspomniałem w pytaniu

//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

Nie ma nic złego z tym kodem - Twój problem musi leżeć gdzie indziej. Zazwyczaj pojawia się ten komunikat o błędzie, gdy wykonujesz '$ scope. $ Apply (...)' – joakimbl

+0

Czy alert nie działa? Jak o użyciu pliku console.log, aby zobaczyć wartość json, jeśli alert daje problem? – BoxerBucks

+0

@BoxerBucks tak, gdy używam console.log nie jest wyrzucanie błąd. ale chciałem tylko poznać przyczynę błędu. –

Odpowiedz

12

alert, jak również confirm i prompt wstrzyma wykonanie kodu (bloki gwintem), podczas którego limity czasu i interwały iść wszystko szaleje, jeśli powinny być uruchomione podczas przerwy. Pętla $digest składa się z dwóch mniejszych pętli, które przetwarzają kolejkę $evalAsync i listę $watch. Kolejka $evalAsync służy do planowania pracy, która musi wystąpić poza bieżącą ramką stosu, ale przed renderowaniem widoku przeglądarki. Zwykle odbywa się to przy pomocy setTimeout(0). Twój alert w tym czasie powoduje problem.

+0

Jest to zdecydowanie problem, ale czy istnieje rozwiązanie, które nie wymaga użycia alertu? – RAC

+0

Używaj nie blokujących alertów (modów). możesz nawet zastąpić window.alert, aby wywołać swój modal. Można również ustawić alerty modalne i mogą wyglądać lepiej niż alerty natywne. – TheSharpieOne

10

Możesz użyć $ timeout, aby wykonać alert po zakończeniu cyklu trawienia iw ten sposób unikniesz tego błędu.

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

Również nie zapomnij wstrzykiwać $ limit czasu w swojej dyrektywie

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

return false w obu przypadkach.

-2

@SharpieOne ma rację, to działa dla mnie.

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

Powiązane problemy