2016-10-05 13 views
0

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

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

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 
    }); 

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

ответ

0

savePromise. и он имеет успех и функцию ошибки. Вы можете попробовать функцию ошибки вместо 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 
    });