【问题标题】:Does Adobe AIR for JS support some sort of non-persistent data container?Adobe AIR for JS 是否支持某种非持久性数据容器?
【发布时间】:2010-10-16 08:00:27
【问题描述】:

对于需要在 Adob​​e AIR 中开发应用程序的项目,我选择 HTML/Ajax 版本。 目前该项目很小,包含登录部分和详细信息部分。

我想做的是在应用启动时显示 login.html,如果成功则显示/浏览到 details.html。

我的问题是,是否有一些快速而肮脏的方法可以将我从登录中收到的一些信息(例如用户 ID)保存在会话/应用程序容器中?

我简要查看了他们的BlackBookSafe 示例,但我看到的是,虽然有多个页面,但他们实际上一直保持blackbooksafe.html 处于打开状态,并将子页面加载到正文中,从而节省了会话数据在blackbooksafe.html
但在我看来,这会造成一种混乱,宁愿让每个页面都自行处理(javascript 方面),这样会更容易阅读。

【问题讨论】:

  • 您使用 AIR 而非传统的基于浏览器的 Web 应用程序的动机是什么?
  • 那么客户想要一个位于客户计算机上的应用程序,该应用程序可以更新用户在网站上与他有关的任何活动。获得此结果的最简单方法是跨平台,即 AIR。把它想象成一个简单的单向信使。
  • 它不是来的,它实际上是对网站的补充。这不是几乎每个 AIR 应用程序都在做的事情吗?

标签: javascript air session-state


【解决方案1】:

好的,我知道这个帖子已经过时了,但如果它对某人有帮助的话。

我的解决方案感觉像是一个完整的 hack - Adob​​e 的耻辱 - 但它有效。

将数据作为 JSON 字符串存储在菜单数据中

菜单在页面加载时保持不变,您可以将自定义数据分配给菜单。到目前为止,它似乎只喜欢简单的数据类型,如字符串或整数。因此解决方案是下载 json2.js (http://json.org) 并使用它的 stringify()parse() 命令将您的应用程序状态转换为 JSON 字符串,然后将其存储在菜单的 .data 成员中。

我将它存储在第一个菜单中。在items 列表中。
使用jQuery,我的应用程序代码如下所示:


function InitApp() {
    // check before we create the menu for the very first time.
    var menu = air.NativeApplication.nativeApplication.menu;
    var firstMenu = menu.items[0];
    var dataStore = firstMenu.data;
    if (dataStore == null) {
        air.trace("Create Menu Data Store");
        var dataObj = { 
            msg: "Message Object",
            status: 1 
        };
        var dataObjStr = JSON.stringify(dataObj);
        firstMenu.data = dataObjStr;
        dataStore = firstMenu.data;
        air.trace("Created menu data store");
        air.trace(dataObjStr);
    } else {
        var dataStore = firstMenu.data;
        var obj = JSON.parse(dataStore);
        air.trace("Retrieved Menu Data Store");
        air.trace(obj.msg);
    }

    BuildMenu();
    // check after we create our menu
    firstMenu = air.NativeApplication.nativeApplication.menu.items[0];
    firstMenu.data = dataStore; // pass it along.

}

$(document).ready(InitApp);

此数据在应用关闭时消失,因此仅在应用打开时保持不变。

真正的答案是 nativeApplication 支持与菜单完全相同的功能!

注意:我是在 Mac 上编写的,因此您必须调整代码以将 NativeWindow.menu 用于 windows / linux。

【讨论】:

    【解决方案2】:

    为什么不直接创建一个常规对象:

    var storage = {};
    

    用法:

    storage.pswd = 'password';
    storage.user = 'username';
    // Retrieval:
    alert(storage.pswd);
    

    【讨论】:

    • 在什么范围内?他只有 html 页面,我猜想在浏览器本地运行。
    • 确实无法在我从一个页面“浏览”到另一个页面的环境中工作。我需要将存储对象附加到不变的东西上,例如 NativeApplication 对象。但我做不到。
    • 所以“我的”解决方案是拥有一个“父”html 页面,带有 IFRAME 是迄今为止唯一可行的解​​决方案......
    【解决方案3】:

    由于您使用的是 AIR,我认为这不是 Web 应用程序。

    Web 应用程序需要会话的原因当然是网页不打开持久连接。但是,在您的情况下,您可以使用正常的持久连接资源,其中包括保持打开状态的数据库连接,并使用您正在使用的任何 dbms 连接解决方​​案包含登录信息。出于您的目的,这应该完成在网络上使用的会话。

    或者,您可以使用单例用户类。在应用程序期间保持打开状态。


    编辑:

    【讨论】:

    • 我将 AIR 用于 Ajax。现在有办法在 javascript 中创建静态类。我希望有一些单例容器可以放置我的数据。对于会话,我的意思不是“网络会话”,而是“程序会话”(从程序启动到关闭)。 Sql 旨在为多个持久化数据...
    • ... 使用,而我的使用仅用于当前会话,当程序关闭时,数据应该会丢失。所以使用 SQL 或文件系统似乎有点过头了。
    • 啊。我认为 javascript 对象将是完美的。只需添加名称-值对 ala "o.name = 'username'; o.pwd = 'password';"等
    • AIR 提供对剪贴板的访问。你也许可以用它做点什么;但是您需要与其他应用程序共享它。或者,由于您可以访问 DOM,因此可以使用 cookie。但如果安全是一个问题,这些都是可以访问的,而且要确保它们在完成后被清空是很棘手的。
    【解决方案4】:

    我看到了一些技巧,例如将数据保存在文件中(在 Adob​​e 的一个示例中使用),或者将其放入数据库中,但我没有找到任何快速的非持久性数据存储。 我希望看到一个连接到 NativeApplication 对象的键/值字典,我可以在其中添加我的非持久性数据,但它不存在。

    最后我选择了 IFRAME 解决方案,父页面存储非持久性数据。

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多