2015-09-30 2 views
2

Я пытаюсь установить $broadcast событие, чтобы указать, что какой-то AJAX происходит, поэтому пользовательский интерфейс отключает элементы управления в форме. В настоящее время кажется, что эти события не входят в очередь событий и немедленно обрабатываются.

Код, над которым я работаю, зависит от этого поведения, поэтому мне интересно, насколько это возможно? Некоторая авторитетная ссылка была бы полезной (в документе не упоминается ничего конкретного).

+1

Вместо использования событий я бы установил переменную scope, как 'isLoading', на' true', когда вы отправляете свой req uest и вернуть его обратно в 'false', когда обещает запрос. Вы можете поместить переменную в '$ rootScope', если вам нужно получить доступ к ней повсюду в вашем приложении. – muenchdo

+1

@muenchdo Флаг 'loading' был на самом деле оригинальным дизайном; однако код развился, и есть несколько служб, выполняющих AJAX и несколько пользовательских интерфейсов, отображаемых одновременно, поэтому должно быть несколько флагов. Кроме того, поскольку контроллеры (в дополнение к представлениям) должны быть уведомлены о событиях, вызов функции '$ scope' неизбежен, и я думаю, что обработчики событий лучше представляют намерение. –

ответ

2

EDIT - После прочтения ваших комментариев может возникнуть необходимость в создании системы очередей с инжекцией зависимостей и обратными вызовами.

app.factory('FirstService', function($rootScope, SecondService){ 
    $rootScope.loading = true 
    .success(function(){ 
    SecondService.AJAXCall(); 
    }); 
}) 
.factory('SecondService', function($rootScope){ 
    var vm = this; 
    vm.AJAXCALL = function(){ 
    $rootScope.processing = true; 
    //AJAX Call 
    .complete(function(){ 
     $rootScope.processing = false; 
     $rootScope.loading = false; 
    }) 
    } 
}) 
.controller('FirstController', function($rootScope){ 
    var vm = this; 
    vm.loading = $rootScope.loading; 
}) 
.controller('SecondController', function($rootScope){ 
    var vm = this; 
    vm.processing = $rootScope.processing; 
}); 

<div ng-controller="FirstController as first"> 
    <form ng-disabled="first.loading"><form> 
</div> 
<div ng-controller="SecondController as second"> 
    <img ng-show="second.processing" /> 
</div> 

$broadcastblasts the event down scope, так что имеет смысл, что они будут уволены сразу и не ставить в очередь событий. Вот визуализация: enter image description here

Как и то, что предлагает muenchdo, возможно, вы захотите добавить переменную области видимости, чтобы указать, следует ли включать или отключать элементы управления.

Добавить логику к контроллеру:

app.module('AppCtrl', function($rootScope){ 
    var vm = this; 
    vm.loading = $rootScope.loading; 
}); 

Затем добавьте логику ngDisabled в HTML:

<div ng-controller="AppCtrl as app"> 
    <form ng-disabled="app.loading"><form> 
</div> 

Тогда перед вашим вызовом AJAX, установить $rootScope переменную:

app.service($rootScope){ 
    $rootScope.loading = true; 
    //AJAX CALL 
    .complete(function(){ 
    $rootScope.loading = false; 
    }); 
} 
Смежные вопросы