Titanium/ Appcelerator Alloy - 关闭多父级 windows

Titanium/ Appcelerator Alloy - Closing multiple parent windows

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

这是我目前所拥有的:

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