使用 Backbone js 视图中的 window.open;失去对视图函数的引用
Using window.open from a Backbone js View; losing reference to View functions
我需要从 Backbone 视图启动一个新的 Window。我的视图文件正在使用 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;
},
这个视图文件还定义了一个"saveToken"函数:
saveToken: function () {
alert("connectorsmain-view.js; saveToken()");
}
Window 启动正常。但是,有一个来自 oAuth 进程的 callback/redirect(在新的 window 中启动),它指向并在 Window 中加载我的新 HTML 文件oAuth 流程结束。驻留在我的服务器上的最终 HTML 文件具有将 oAuth access_token 传递回打开新 Window:
的原始屏幕的脚本
var access_token = (window.location.hash||window.location.search).match(/access_token=([^&]+)/);
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。
如果我在作为视图模板的 HTML 中定义了一个 "saveToken" 函数,那么它会按预期工作。但是,我想要视图文件中的函数,而不是模板文件中的函数。
非常感谢任何想法!
像这样的东西应该可以工作:
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();
然后从child window:
window.opener.openerView.saveToken(access_token);
window.close();
显然这会修改调用中的全局范围 window,因此如果您希望同时拥有多个此类视图,请务必小心。
另一个选项(需要测试)是将打开的视图引用复制到打开的范围内 window,尽管它是非正统的并且可能无法工作 cross-browser
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();
我需要从 Backbone 视图启动一个新的 Window。我的视图文件正在使用 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;
},
这个视图文件还定义了一个"saveToken"函数:
saveToken: function () {
alert("connectorsmain-view.js; saveToken()");
}
Window 启动正常。但是,有一个来自 oAuth 进程的 callback/redirect(在新的 window 中启动),它指向并在 Window 中加载我的新 HTML 文件oAuth 流程结束。驻留在我的服务器上的最终 HTML 文件具有将 oAuth access_token 传递回打开新 Window:
的原始屏幕的脚本var access_token = (window.location.hash||window.location.search).match(/access_token=([^&]+)/);
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。
如果我在作为视图模板的 HTML 中定义了一个 "saveToken" 函数,那么它会按预期工作。但是,我想要视图文件中的函数,而不是模板文件中的函数。
非常感谢任何想法!
像这样的东西应该可以工作:
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();
然后从child window:
window.opener.openerView.saveToken(access_token);
window.close();
显然这会修改调用中的全局范围 window,因此如果您希望同时拥有多个此类视图,请务必小心。
另一个选项(需要测试)是将打开的视图引用复制到打开的范围内 window,尽管它是非正统的并且可能无法工作 cross-browser
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();