【问题标题】:Titanium/ Appcelerator Alloy - Closing multiple parent windowsTitanium/ Appcelerator Alloy - 关闭多个父窗口
【发布时间】:2017-03-22 16:27:24
【问题描述】:

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

  • 主页:点击按钮应转到仪表板。单击 Android 后退按钮应退出应用程序
  • dashboard:点击按钮应该会打开profile。单击 Android 后退按钮应关闭当前窗口并返回到主页
  • 个人资料:点击按钮应该会打开设置。单击 Android 后退按钮应关闭当前窗口并返回到 dashboard
  • 设置:点击该按钮应关闭设置仪表板个人资料页面并将用户返回到。单击 Android 后退按钮应仅关闭当前窗口并返回到 profile

这是我目前所拥有的:

首页

<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 来关闭两个父窗口。

【问题讨论】:

    标签: titanium appcelerator appcelerator-titanium titanium-alloy appcelerator-alloy


    【解决方案1】:

    有两种最佳方法:

    方法一:使用纯JS事件调度系统。

    创建一个文件'EventDispatcher.js'并放在app-lib文件夹中,并将这段代码放入其中。

    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

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

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

    【讨论】:

    • 你觉得我的方式怎么样?我还编辑了您的答案以删除这些图像。
    • 这是一回事,你可以将任何东西作为回调传递......整个控制器引用或数组或任何你喜欢的东西,但逻辑是将一些东西传递给它..
    • 还告诉我为什么我的答案没有考虑那些图像代码并为我抛出错误的原因。我无法从 Stack Overflow 中找到任何正当理由。
    • 不知道!如果问题仍然存在,请尝试元堆栈溢出
    【解决方案2】:

    我设法做到这一点的方法是像这样传递父窗口:

    首页

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-25
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多