在Backbone js View中使用window.open;失去对View功能的引用

时间:2016-10-18 18:40:27

标签: backbone.js window.opener

我需要从Backbone View启动一个新窗口。我的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>

我的视图文件设置了一个事件映射:

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

此View文件还定义了“saveToken”函数:

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

窗口启动正常。但是,oAuth进程有一个回调/重定向(在新窗口中启动),它指向并在oAuth流结束时在Window中加载我的新HTML文件。最终的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不是函数。它没有在View文件级别识别“saveToken”fxn。

如果我在作为View模板的HTML中定义“saveToken”函数,那么它将按预期工作。但是,我想在View文件中使用该函数,而不是在模板文件中。

非常感谢任何想法!

1 个答案:

答案 0 :(得分: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();