Использование window.open из представления Backbone js; потеря ссылки на функции просмотра

Мне нужно запустить новое окно из Backbone View. Мой файл просмотра использует шаблон HTML.

Шаблон HTML имеет этот фрагмент кода:

<a id="providerIcons">
        <div style='display:inline-block; padding-right:30px;text-align: center;'><img width='110' height='110' src='app/assets/images/dropboxLogo.jpg' /><br/>DropBox</div>
    </a>

Файл My View устанавливает сопоставление событий:

events: {
                "click #providerIcons" : "onProvidersClick"
            },

и у меня есть onProvidersClick, также определенный в представлении:

onProvidersClick: function () {
                var URL = "https://www.dropbox.com/1/oauth2/authorize?client_id=xyz&response_type=token&redirect_uri=http://localhost:9098/handleOauth.html";

                **var oauthwindow = window.open(URL, "SignIn", "width=650,height=550,toolbar=0,scrollbars=0,status=0,resizable=0,location=0,menuBar=0");**

                oauthwindow.focus();
                return false;
            },

Этот файл представления также определяет функцию «saveToken»:

saveToken: function () {
                alert("connectorsmain-view.js; saveToken()");
            }

Окно запускается нормально. Однако есть обратный вызов/перенаправление из процесса oAuth (запущенный в новом окне), и он указывает и загружает мой новый файл HTML в окне в конце потока oAuth. В этом последнем файле HTML, который находится на моем сервере, есть скрипт для передачи oAuth access_token обратно на исходный экран, открывающий новое окно:

var access_token = (window.location.hash||window.location.search).match(/access_token=([^&amp;]+)/);

        if(access_token){
            // Save the first match
            access_token = decodeURIComponent(access_token[1]);
            **window.opener.saveToken(access_token);**
            window.close();
        }

Я получаю сообщение об ошибке, что window.opener.saveToken не является функцией. Он не распознает «saveToken» fxn на уровне файла просмотра.

Если я определяю функцию «saveToken» в HTML, которая является шаблоном для представления, то она работает так, как ожидалось. Но мне нужна функция в файле просмотра, а не в файле шаблона.

Очень ценю любые мысли!


person SGarrity    schedule 18.10.2016    source источник


Ответы (1)


Что-то вроде этого должно работать:

var oauthwindow = window.open(URL, "SignIn", "width=650,height=550,toolbar=0,scrollbars=0,status=0,resizable=0,location=0,menuBar=0");**

window.openerView = this;
oauthwindow.focus();

Затем из дочернего окна:

window.opener.openerView.saveToken(access_token);
window.close();

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

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

var oauthwindow = window.open(URL, "SignIn", "width=650,height=550,toolbar=0,scrollbars=0,status=0,resizable=0,location=0,menuBar=0");**

oauthwindow.openerView = this;
oauthwindow.focus();

Затем

window.openerView.saveToken(access_token);
window.close();
person mikeapr4    schedule 18.10.2016