Эмбер открыть новое окно, избегая всплывающего блокатора в успешном обещании

Я изо всех сил пытаюсь найти способ открыть новое окно внутри then()обещания после создания записи магазина и сохранения.

Следующий код блокируется блокировщиком всплывающих окон chrome

var obj = this.get('store').createRecord('user', {
  first_name: 'John',
  last_name: 'Smith'
});

obj.save()
  .then(function (user) {
    window.open('http://google.com', '_blank'); // this is blocked by chrome pop-up blocker
  })
  .catch(function (error) {
    this.set('errors', error.errorArray); // display errors in the template
  });

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

var window_handle = window.open('', '_blank');

var obj = this.get('store').createRecord('user', {
  first_name: 'John',
  last_name: 'Smith'
});

obj.save()
  .then(function (user) {
    window_handle.location.href = 'http://google.com'; // this is NOT blocked by chrome pop-up blocker
  })
  .catch(function (error) {
    this.set('errors', error.errorArray); // display errors in the template
  });

У кого-нибудь есть идея получше?

1 ответ

  1. save возвращается Promise. и он имеет функцию успеха и ошибки.Вы можете попробовать функцию ошибки вместо catch.
    http://emberjs.com/api/data/classes/DS.Model.html#method_save

    obj.save()
      .then(function (user) {
        var window_handle = window.open('', '_blank'); //if you need window_handle outside then you keep reference outside.
        window_handle.location.href = 'http://google.com'; // this is NOT blocked by chrome pop-up blocker
      },function (error) {
        this.set('errors', error.errorArray); // display errors in the template
      })
      .catch(function (error) {
        this.set('errors', error.errorArray); // display errors in the template
      });