Titanium/ Appcelerator Alloy - 关闭多父级 windows
Titanium/ Appcelerator Alloy - Closing multiple parent windows
我有 4 个视图,所有视图都带有一个按钮。我想要以下简单的行为。
- home:单击按钮应转到 dashboard。单击 Android 后退按钮应退出应用程序
- 仪表板:单击该按钮应打开 个人资料。单击 Android 后退按钮应关闭当前 window 和 return 返回 home.
- 个人资料:点击按钮应该会打开设置。单击 Android 后退按钮应关闭当前 window 和 return 返回 仪表板 .
- settings:单击按钮应关闭 settings、dashboard 和 个人资料 页面和return 用户返回主页。单击 Android 后退按钮应该只会关闭当前 window 和 return 回到 配置文件 。
这是我目前所拥有的:
家
<Alloy>
<Window class="container">
<Button onClick="openProfile">Open Dashboard</Button>
</Window>
</Alloy>
使用 JS:
function openDashboard() {
Alloy.createController('dashboard').getView();
}
仪表板
<Alloy>
<Window class="container">
<Button onClick="openProfile">Open Profile</Button>
</Window>
</Alloy>
使用 JS:
function openProfile() {
Alloy.createController('profile').getView();
}
简介
<Alloy>
<Window class="container">
<Button onClick="openSettings">Open Settings</Button>
</Window>
</Alloy>
使用 JS:
function openSettings() {
Alloy.createController('settings').getView();
}
设置
<Alloy>
<Window class="container">
<Button onClick="backToHome">Back To Home</Button>
</Window>
</Alloy>
但是我不确定使用 JS 来关闭父节点 windows。
有两种最佳方法:
方法一:使用纯JS事件派发系统。
在 app-lib 文件夹中创建并放置一个文件 'EventDispatcher.js' 并将此代码放入其中。
module.exports = _.clone(Backbone.Events)
将此代码放入 dashboard.js & profile.js
var eventsDispatcher = require('EventDispatcher');
eventsDispatcher.on('closeEventFromSettings', closeMethod);
function closeMethod() {
eventsDispatcher.off('closeEventFromSettings', closeMethod);
$.getView().close();
}
最后在 settings.js 上使用此代码,只要您想关闭仪表板和配置文件 windows
require('EventDispatcher').trigger('closeEventFromSettings');
方法 2:将回调传递给 window 控制器。
dashboard.js
function closeMe() {
$.dashboard.close();
}
function openProfile() {
Alloy.createController('profile', {cb: closeMe}).getView();
}
profile.js
function closeMe() {
$.args.cb(); // it will close the dashboard
$.profile.close();
}
function openSettings() {
Alloy.createController('settings', {cb: closeMe}).getView();
}
settings.js
function backToHome() {
$.args.cb();
}
显然还有其他方法,但我更喜欢仅从性能和维护角度使用这两种方法。
我设法做到这一点的方法是像这样传递父 windows:
家
function openDashboard() {
Alloy.createController('dashboard', {'parent': $}).getView();
}
仪表板
function openProfile() {
Alloy.createController('profile', {'parent': $}).getView();
}
个人资料
function openSettings() {
Alloy.createController('settings', {'parent': $}).getView();
}
设置
function backToHome() {
$.getView().close(); // Close current window
$.args.parent.getView().close(); // Close profile window
$.args.parent.args.parent.getView().close(); // Close dashboard
}
循环可以使上面的代码更具可读性,如下所示:
function backToHome() {
var controller = $;
for (var i = 0; i < 3; i++) {
controller.getView().close();
controller = controller.args.parent;
}
}
我有 4 个视图,所有视图都带有一个按钮。我想要以下简单的行为。
- home:单击按钮应转到 dashboard。单击 Android 后退按钮应退出应用程序
- 仪表板:单击该按钮应打开 个人资料。单击 Android 后退按钮应关闭当前 window 和 return 返回 home.
- 个人资料:点击按钮应该会打开设置。单击 Android 后退按钮应关闭当前 window 和 return 返回 仪表板 .
- settings:单击按钮应关闭 settings、dashboard 和 个人资料 页面和return 用户返回主页。单击 Android 后退按钮应该只会关闭当前 window 和 return 回到 配置文件 。
这是我目前所拥有的:
家
<Alloy>
<Window class="container">
<Button onClick="openProfile">Open Dashboard</Button>
</Window>
</Alloy>
使用 JS:
function openDashboard() {
Alloy.createController('dashboard').getView();
}
仪表板
<Alloy>
<Window class="container">
<Button onClick="openProfile">Open Profile</Button>
</Window>
</Alloy>
使用 JS:
function openProfile() {
Alloy.createController('profile').getView();
}
简介
<Alloy>
<Window class="container">
<Button onClick="openSettings">Open Settings</Button>
</Window>
</Alloy>
使用 JS:
function openSettings() {
Alloy.createController('settings').getView();
}
设置
<Alloy>
<Window class="container">
<Button onClick="backToHome">Back To Home</Button>
</Window>
</Alloy>
但是我不确定使用 JS 来关闭父节点 windows。
有两种最佳方法:
方法一:使用纯JS事件派发系统。
在 app-lib 文件夹中创建并放置一个文件 'EventDispatcher.js' 并将此代码放入其中。
module.exports = _.clone(Backbone.Events)
将此代码放入 dashboard.js & profile.js
var eventsDispatcher = require('EventDispatcher');
eventsDispatcher.on('closeEventFromSettings', closeMethod);
function closeMethod() {
eventsDispatcher.off('closeEventFromSettings', closeMethod);
$.getView().close();
}
最后在 settings.js 上使用此代码,只要您想关闭仪表板和配置文件 windows
require('EventDispatcher').trigger('closeEventFromSettings');
方法 2:将回调传递给 window 控制器。
dashboard.js
function closeMe() {
$.dashboard.close();
}
function openProfile() {
Alloy.createController('profile', {cb: closeMe}).getView();
}
profile.js
function closeMe() {
$.args.cb(); // it will close the dashboard
$.profile.close();
}
function openSettings() {
Alloy.createController('settings', {cb: closeMe}).getView();
}
settings.js
function backToHome() {
$.args.cb();
}
显然还有其他方法,但我更喜欢仅从性能和维护角度使用这两种方法。
我设法做到这一点的方法是像这样传递父 windows:
家
function openDashboard() {
Alloy.createController('dashboard', {'parent': $}).getView();
}
仪表板
function openProfile() {
Alloy.createController('profile', {'parent': $}).getView();
}
个人资料
function openSettings() {
Alloy.createController('settings', {'parent': $}).getView();
}
设置
function backToHome() {
$.getView().close(); // Close current window
$.args.parent.getView().close(); // Close profile window
$.args.parent.args.parent.getView().close(); // Close dashboard
}
循环可以使上面的代码更具可读性,如下所示:
function backToHome() {
var controller = $;
for (var i = 0; i < 3; i++) {
controller.getView().close();
controller = controller.args.parent;
}
}