Titanium 钛/Appcelerator合金-关闭多个父窗口

Titanium 钛/Appcelerator合金-关闭多个父窗口,titanium,appcelerator,appcelerator-titanium,titanium-alloy,appcelerator-alloy,Titanium,Appcelerator,Appcelerator Titanium,Titanium Alloy,Appcelerator Alloy,我有4个视图,都有一个按钮。我想要以下简单的行为 主页:单击按钮应进入仪表板。单击Android后退按钮应退出应用程序 仪表板:单击按钮应打开配置文件。单击Android后退按钮应关闭当前窗口并返回主页。 配置文件:单击按钮应打开设置。单击Android后退按钮应关闭当前窗口并返回到仪表板。 设置:单击按钮应关闭设置、仪表板和配置文件页面,并将用户返回主页。单击Android后退按钮应仅关闭当前窗口并返回到配置文件。 这就是我到目前为止所做的: 家 仪表板 侧面图 背景 但是,我不确定如何使用J

我有4个视图,都有一个按钮。我想要以下简单的行为

主页:单击按钮应进入仪表板。单击Android后退按钮应退出应用程序 仪表板:单击按钮应打开配置文件。单击Android后退按钮应关闭当前窗口并返回主页。 配置文件:单击按钮应打开设置。单击Android后退按钮应关闭当前窗口并返回到仪表板。 设置:单击按钮应关闭设置、仪表板和配置文件页面,并将用户返回主页。单击Android后退按钮应仅关闭当前窗口并返回到配置文件。 这就是我到目前为止所做的:

仪表板

侧面图

背景


但是,我不确定如何使用JS关闭两个父窗口。

有两种最佳方法:

方法1:仅使用JS事件调度程序系统

在applib文件夹中创建并放置一个文件“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上使用此代码

require('EventDispatcher').trigger('closeEventFromSettings');
方法2:将回调传递给窗口控制器

dashboard.js

profile.js

var eventsDispatcher = require('EventDispatcher');
eventsDispatcher.on('closeEventFromSettings', closeMethod);

function closeMethod() {
    eventsDispatcher.off('closeEventFromSettings', closeMethod);
    $.getView().close();
}
settings.js


显然还有其他方法,但我更倾向于仅从性能和维护的角度使用这两种方法。

我设法做到这一点的方法是通过如下方式传递父窗口:

仪表板

侧面图

背景

循环可以使上述代码更具可读性,如下所示:

function backToHome() {   
     var controller = $;
     for (var i = 0; i < 3; i++) {
         controller.getView().close();
         controller = controller.args.parent;
     }
}

你觉得我的方式怎么样?我还编辑了你的答案来删除这些图片。这是同样的事情,你可以通过任何回调。。。要么是整个控制器引用,要么是一个数组,或者你喜欢的任何东西,但是逻辑是传递一些东西到其中。同时告诉我为什么我的答案没有考虑到那些图像代码并为我抛出错误。我无法从堆栈溢出中找到任何有效的原因。不知道!如果问题仍然存在,请尝试元堆栈溢出
function openSettings() {
    Alloy.createController('settings').getView(); 
}
<Alloy>
    <Window class="container">
        <Button onClick="backToHome">Back To Home</Button>
    </Window>
</Alloy>
module.exports = _.clone(Backbone.Events)
var eventsDispatcher = require('EventDispatcher');
eventsDispatcher.on('closeEventFromSettings', closeMethod);

function closeMethod() {
    eventsDispatcher.off('closeEventFromSettings', closeMethod);
    $.getView().close();
}
require('EventDispatcher').trigger('closeEventFromSettings');
function closeMe() {
    $.dashboard.close();
}

function openProfile() {
    Alloy.createController('profile', {cb: closeMe}).getView(); 
}
function closeMe() {
    $.args.cb();    // it will close the dashboard
    $.profile.close();
}

function openSettings() {
    Alloy.createController('settings', {cb: closeMe}).getView(); 
}
function backToHome() {
    $.args.cb();
}
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;
     }
}