AngularJS Ожидание обещания $resource в области действия клика пользователя

Я новичок в разработке внешнего интерфейса / AngularJS и прочитал (но не совсем понял) много вопросов о переполнении стека и другую документацию о ng-resource / $resource и обещаниях. У меня какая-то странная ситуация.

У меня есть этот код в функции отправки, когда пользователь нажимает кнопку для отправки формы.

        var Resource = $resource("/urlHere",{},{save: {method:'POST', isArray:true}});
        Resource.save(JSON.stringify($scope.validQuery)).$promise.then(function(data) {

        $scope.initialResults=data;

        if($scope.initialResults.length === 0){
           alert("No Results Found!");

        }else if($scope.initialResults.length === 1){
            window.data = $scope.initialResults;
            window.open('/detailedResults');

       }else if($scope.initialResults.length > 1){
            window.data = $scope.initialResults;
            var popupWindowResults = window.open('/resultsGrid');
        }
      });

Мне нужно открыть определенную вкладку в зависимости от того, сколько результатов я получу. (В основном показать сетку с несколькими результатами на выбор или просто показать один результат, если возвращается только 1) Использование window.open работает нормально, если оно не содержится в $promise.then. В $promise.then браузеры рассматривают его как всплывающее окно, а не как новую вкладку в результате того, что пользователь что-то щелкнул.

Есть ли способ просто остановить выполнение до тех пор, пока не будут возвращены результаты, чтобы я мог открыть вкладку за пределами $promise.then и в функции отправки? Любое решение будет чрезвычайно полезным.


person Chris    schedule 14.11.2014    source источник
comment
Я не уверен, почему это происходит, но вы пытались вызвать функцию, которая делает window.open? И вы пробовали использовать $window (вводить) вместо обычного окна?   -  person sam    schedule 14.11.2014
comment
Да, я пробовал оба. То, что я ДУМАЮ здесь происходит, связано с асинхронным вызовом. Функция, которая выполняется из-за щелчка ПОЛЬЗОВАТЕЛЯ, завершается. Затем асинхронный вызов завершается. Затем браузер не думает, что пользователь открывает эту вкладку, и поэтому рассматривает ее как ненадежное всплывающее окно.   -  person Chris    schedule 14.11.2014
comment
Возможно, вам следует рассмотреть модальный диалог вместо нового окна. Обычно приводит к лучшему пользовательскому опыту.   -  person Clint Powell    schedule 14.11.2014
comment
затем вы можете имитировать щелчок по вымышленному тегу ‹a›, который будет работать как переход на новую страницу.   -  person sam    schedule 14.11.2014
comment
@ClintPowell Спасибо за ваше предложение, однако требования заключаются в том, что пользователь хочет иметь полноценную страницу результатов на новой вкладке, иметь возможность сохранить ее и иметь возможность вернуться на вкладку поиска и получить другую страницу результатов.   -  person Chris    schedule 14.11.2014
comment
Хм. Возможно, вы можете открыть новое окно в методе щелчка, иметь экран результатов загрузки в окне до тех пор, пока результаты не загрузятся, а затем программно отправить результаты в дочернее окно.   -  person Clint Powell    schedule 14.11.2014
comment
@clint — хорошая идея, даже если для открытия вкладки может потребоваться много работы. Кроме того, это будет означать, что открытая страница содержит также угловое приложение, так ли это?   -  person sam    schedule 14.11.2014


Ответы (1)


http://jsfiddle.net/az066xcs/2/

$scope.getResults = function() {
    var win = window.open();

    // this is a placeholder for the async call that gets results
    setTimeout(function() {
        win.document.write('<h1>Results Loaded!</h1>');
    }, 1000);
};

Вы можете открыть окно по щелчку, затем асинхронно загрузить результаты и вставить их в новое окно. Очевидно, что лучшим решением, чем пустое окно с document.write, было бы другое угловое приложение в новом окне или, по крайней мере, простое приложение javascript.

person Clint Powell    schedule 14.11.2014
comment
Это правильная идея, блокировщики всплывающих окон разрешают новые окна, если вызов сделан из стека, который был инициирован пользовательским событием щелчка. Нет, если вы вызываете window.open самостоятельно (что делает OP при попытке вызвать window.open после вызова AJAX - person Juan Mendes; 14.11.2014
comment
Ааааа, да это здорово. Откройте окно по щелчку пользователя, а затем обновите окно позже, когда будут возвращены результаты. В основном я открываю другое угловое приложение, и теперь я использую win.location.href='' для обновления окна, когда получаю результаты. Большое спасибо за ваше время! - person Chris; 14.11.2014