저는 아약스를 사용하여 콘텐츠를로드해야하는 컨트롤러가 있습니다. 로딩 중에 중간에 스피너가 나타나기를 바랍니다.
<i class="fa fa-2x fa-spin fa-spinner" ng-show="isLoadingContent"></i>
그리고 해당 JS : 코드는 다음과 같이 보이는
$scope.isLoadingContent = true;
$q.all(promises).then(function (values) {
$scope.isLoadingContent = false;
// more code - display returned data
그러나, UI는 회가 나타나지 않습니다 어디에/내가 코드를 단계별로 때 나타날 것으로 예상 할 때 .
$scope.isLoadingContent = true;
debugger; // the spinner does not appear on the UI
$q.all(promises).then(function (values) {
debugger; // the spinner finally does appear in the UI at this point
$scope.isLoadingContent = false;
// more code - display returned data
것은 내가 코드를 단계별로 시도했지만에 관한 짧은 와서 무슨 일이 일어나고 있는지 한 - 와 나는 각 사이클은 그것의 재생 이벤트 루프에서 일어나는 일련의 사건을 오해하고 확신 이 모든 역할.
회 전자가 내가 설정 한 장소가 아닌 약속의 방법으로 표시되도록 설정된 이유에 대해 설명 할 수 있습니까? 실제로 설정되는 것이 아니라 이벤트 루프의 메시지 큐에서 queue'd를 가져 오는 것입니까?
은 ------------ 편집 ------------
나는 무슨 일이 일어나고 있는지에 관한 설명을 가로 질러왔다 생각합니다. @jcford와 @istrupin에게 감사드립니다.
원본 게시물에 누락 된 약간의 재미있는 알림, 약속 통화를 실행하는 이벤트 및 회 전자 업데이트는 사실 현재 $scope.$on("some-name", function(){...})
이벤트를 기반으로합니다. 즉, 현재 컨트롤러 범위 외부에서 트리거되는 클릭 이벤트입니다. 나는 이것이 이벤트 발생이 해고 된 곳 때문에 $ digest cycle이 일반적으로하는 것처럼 작동하지 않는다고 믿는다. 따라서 $on
함수의 모든 업데이트는 정상적으로하는 것처럼 $ apply/$ digest를 호출하지 않습니다. 즉, $ digest 호출을 특별히 만들어야합니다.
이상하게도, $q.all()
에서 $apply
을 호출해야하므로 디버깅 할 때 예상 한 DOM 변경 사항을 확인했습니다. Fwiw.
tl; dr - $digest
으로 전화하십시오.
제공하시기 바랍니다 [mcve] –
번 대신 NG 쇼의 NG-경우 사용해 볼 수 있습니다. – Ved
약속이 어떻게 작성되었는지 보여줄 수 있습니까? –