0

我正在开发一个包含事件和任务的 Titanium 应用程序,并且我希望将它们同步到云存储,这样用户只要提供登录信息,就可以从任何应用程序或浏览器访问他们的事件和任务。

看起来 Appcelerator/Titanium 使这一切变得非常容易,但他们在记录它方面做得很糟糕。也许我不明白。那么任何人都可以确认或更正我在下面绘制的图片吗?

  1. Titanium Alloy 应用程序允许您通过在 /models 文件夹中的 JSON 文件中定义模型来创建模型。如果您为该对象指定一个属性,如下所示:adapter: {type:'acs'}...那么,只要您对该对象调用 .save() 命令,Alloy 就会将该对象存储在 ACS 中。

  2. 为了使其工作,您当然必须让您的应用程序连接到 ACS,您可以通过单击 tiapp.xml 图形界面中的“Cloud-enable”按钮来完成此操作。当然,您必须确保应用程序使用特定的用户名-密码组合登录 ACS。

如果我乐观地看待我的消息来源,这似乎就是您需要做的所有事情。这些来源是:

但是后来我看到每个人都提到了Aaron Saunders的示例项目,其中包含一些自定义文件,这些文件似乎构建在 Alloy 之上,以使这个适配器:{type:'acs'} 成为可能。要查看我在说什么,请转到 app/assets/alloy/sync 文件夹并查看那里的 acs.js 文件。此外, Tony Lukasavage在一年前的问答中说,目前没有为 Alloy 构建的 ACS 同步适配器。他指向 Aaron Saunders 的项目http://alloylove.com/#寻求解决方案。

发生什么了?它是否确实全部内置在 Alloy/Backbone 中,只是没有在任何地方记录,并且 Aaron Saunders 是在示例项目中使用内置的东西,还是我需要在我的项目中包含 Aaron 的代码才能使其全部工作?

感谢您的任何提示!维策

自我注意:也试试这个例子,它需要创建一个新项目:https ://wiki.appcelerator.org/display/td/11.+Storing+data+in+ACS

4

2 回答 2

3

我已经掌握了 Aaron Saunders 的 ACS Sync 的窍门。由于他的 README 假设比我开始时拥有更多的先验知识,我想我会在此处放置我自己的小手册以供将来参考。

首先,您需要先了解 Backbone,然后再了解 Alloy 和 Backbone 的具体组合。Backbone 允许您执行面向对象的 Javascript:如果您的应用程序都是关于书籍的,那么您可以定义一本书的一般外观。您可以将其称为类,但 Backbone 将其称为模型。任何。

基本上,Backbone 将一个 Javascript 对象转换为一个模板(模型),您可以从中创建任意数量的特定实例。通过创建此模型的实例(也是一个 Javascript 对象),您可以为该对象提供一大堆功能,例如添加一个事件侦听器的选项,该事件侦听器会在对象的值以任何方式更改时触发。

创建主干模型及其实例

如果您不使用 Alloy,则创建 Backbone 模型的方法是:

var Book = Backbone.Model.extend({}); 

在此示例中,您根本没有添加任何规范。因此,创建的“Book”模板/模型获得了许多 Backbone 功能,例如添加事件侦听器的选项,但您没有自定义任何内容。

然后,使用new关键字,您可以创建此模型的特定实例,即特定书籍。喜欢:

var myNewBook = new Book({title:"Moby Dick"}};

合金模型:app/models 中的文件

现在,Alloy 的工作方式是在 app/models 文件夹内的特定文件中定义模型,文件名就是模型的名称。因此,如果您想以 Alloy 方式创建 Book 模型,您应该创建一个文件 app/models/book.js,该文件应提供一个结构如下的导出(以 Book 的概念为例):

exports.definition = {

    config: {
        columns: {
            "title": "String",
            "pages": "Number",
        },
        defaults: {
            "title": "Default book title",
            "pages": 0,
        },
        adapter: {
            "type": "sql"
        }
    }
}

请注意,这是关于您的模型的最低限度的定义。并且“适配器”位是高度可选的:稍后会清楚我为什么包含它。它的作用是指定 Backbone 应该将从该模型创建的 Javascript 对象(仅存储在内存中)同步到特定的数据存储。

您可能想要定义更多。事实上,如果你想进行 Backbone/Alloy/ACS 同步,你就必须这样做。但首先,让我们尝试在 Javascript 中创建一个 Backbone 对象。

从合金模型创建主干对象

现在,每当您想创建 Book 模型的实例时,您在代码中所做的就是使用Alloy.createModel正确的模型名称和参数字典。像这样:

var oneBook = Alloy.createModel('Book',{title:"Moby Dick",pages:300});

Alloy 将在 app/models 文件夹中查找“book.js”文件,使用其中定义的所有属性,并返回一个带有一些 Alloy 附加功能的 Backbone 对象。

(请注意,Alloy 似乎对模型一词的含义有些困惑。您实际上并不是在创建模型,而是模型的一个实例。或者我只是不明白)

ACS 适配器

Aaron Saunders 用于自动同步 Alloy/Backbone 对象的解决方案涉及调整 Alloy 使用主干模型的方式。这就是为什么您需要从他的项目中包含至少两个文件才能使其正常工作的原因:

  • /app/assets/alloy/sync/acs.js(这是安排 Alloy/Backbone 对象同步到 ACS 的“适配器”)
  • app/alloy.jmk(在安装应用程序时,此文件会进行一些必要的文件系统重写)

当您安装这些文件时,Backbone 同步功能现在可以使用一个名为“acs”的新适配器。

骨干模型具有各种附加功能,包括将对象同步到数据存储(如 SQLite 数据库或 localStorage)的功能。此外,Backbone 允许程序员创建“适配器”,告诉它将数据同步到自定义数据存储。

Aaron Saunders 的解决方案将数据同步到 ACS。通过将 acs.js 文件包含在正确的文件夹中,您可以确保 Backbone/Alloy 将使用该文件来组织同步。

骇人听闻的部分

因此,如果您定义了上面定义的 Book 模型,并使用 Alloy.createModel() 在 Javascript 中创建了 Book,那么 Alloy 将查找 book.js 文件并将其用作添加自定义值的模板(如标题)您指定的。

此外,由于 acs.js 适配器,它会自动将新对象踢到 ACS。

也就是说,如果您提供一点帮助,因为有些人可能会在以后清理一些 hacky 位,但现在仍然需要它。即:在模型定义中,您需要包含一个设置字典,其中包含两个重复对象名称的参数。(是的,听起来很傻)

这是模型文件的完整示例:

exports.definition = {

    config: {
        columns: {
            "title": "String",
            "pages": "Number",
        },
        defaults: {
            "title": "Default book title",
            "pages": 0,
        },
        adapter: {
            "type": "acs"
        },
        "settings": {
            "object_name": "users",
            "object_method": "Users"
        }
    }
}

总之 ,我希望这有助于弄清楚 Alloy 如何在 Backbone 上构建以及 Aaron Saunders 如何在该组合之上构建。

我自己还没有回答的问题是:

  • 当您从代码中的模型创建 Backbone 对象时,它会同步到 ACS 云。但是,当您希望交通流向另一个方向时,交通又是如何运作的呢?如果在云中的数据发生了变化怎么办:您将如何收到通知?你需要订阅吗?

  • 应用离线时会发生什么?在应用重新上线之前,您的待处理数据更改是否会被缓存?如果应用在同步缓存数据之前关闭,会发生什么情况?

于 2014-10-04T08:43:33.697 回答
0

好的,所以我想通了。您所要做的就是将 adapter: {type:'acs'} 添加到对象定义中以便将其同步到 ACS 的“简单”示例确实依赖于 Aaron Saunders 的示例代码。他最好的解释在这里:https ://github.com/aaronksaunders/ci.alloy.adapter.two

如果你想使用他的东西,基本上你只需要从他的项目中复制两个文件到你自己的项目中:app/alloy.jmk(这做了一些我不完全理解的花哨的文件名重写)app/assets/alloy/ sync/acs.js(这是他的东西的核心)

这对我来说似乎很有希望,但现在我想我只会以自己的方式创建自己的对象,然后使用常规的 Ti.Cloud 方法将它们同步到 ACS。

于 2014-09-29T09:25:09.570 回答