使用Alloy和Backbone同步数据到Titanium ACS



我正在开发一个具有事件和任务的Titanium应用程序,我希望这些应用程序与云存储同步,以便用户可以从任何应用程序或浏览器访问他们的事件和任务,只要他们提供登录。

Appcelerator/Titanium似乎使这一切变得非常简单,然而他们在记录它方面却很糟糕。也许我不明白。有人能确认或更正我下面画的图片吗?

  1. 钛合金应用程序允许您通过在/models文件夹中的JSON文件中定义模型来创建模型。如果您为该对象指定如下属性:adapter: {type:'acs'}…那么,无论何时在对象上调用.save()命令,Alloy都将在ACS中存储该对象。

  2. 为了使它工作,你当然必须使你的应用程序连接到ACS,你通过点击tiapp.xml图形界面中的"Cloud-enable"按钮。当然,您必须确保应用程序使用特定的用户名密码组合登录ACS。

如果我乐观地看待我的资源,这似乎是所有你需要做的。这些来源是:

<<ul>
  • Appcelerator培训/gh>但后来我看到每个人都提到了Aaron Saunders的一个示例项目,其中有一些自定义文件似乎构建在Alloy之上,以使此适配器:{type:'acs'}成为可能。要了解我所说的内容,请转到app/assets/alloy/sync文件夹并查看其中的acs.js文件。另外,Tony Lukasavage在一年前的一个问答中说,目前还没有针对Alloy的内置ACS同步适配器。他指向Aaron Saunders的项目http://alloylove.com/#寻求解决方案。

    这是怎么回事?它确实都内置到合金/主干,只是没有记录在任何地方,是亚伦桑德斯使用内置的东西为一个示例项目,还是我需要包括亚伦的代码在我的项目中,以使其全部工作?

    谢谢你的建议!Wytze

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

  • 我已经掌握了Aaron Saunders的ACS Sync的窍门。因为他的自述文件假定读者比我刚开始的时候有更多的先验知识,所以我想我应该把我自己的小手册放在这里以供将来参考。

    首先,您需要首先了解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对象。

    从Alloy模型创建Backbone对象

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

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

    Alloy将在app/models文件夹中查找'book.js'文件,使用那里定义的所有属性,并返回一个带有一些Alloy铃铛和口哨的Backbone对象。

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

    ACS适配器

    Aaron Saunders自动化Alloy/Backbone对象同步的解决方案包括调整Alloy使用骨干模型的方式。这就是为什么您需要从他的项目中包含至少两个文件才能使其全部工作:
    • /app/资产/合金/同步/acs.js(这是安排Alloy/Backbone对象同步到ACS的"适配器")
    • app/alloy.jmk(该文件在安装应用程序时进行一些必要的文件系统重写)

    当你安装这些文件时,主干同步功能现在可以使用一个名为'acs'的新适配器。

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

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

    黑客部分

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

    而且,它会自动将新对象踢到ACS,这要感谢ACS .js适配器。

    也就是说,如果你帮了一点忙,因为有一个很粗糙的部分,有些人可能稍后会清理,但现在仍然需要。也就是说:在模型定义中,需要包含一个带有两个参数的设置字典,这两个参数重复对象的名称。(是的,这听起来很傻)

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

    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云。但是当你想让它往相反的方向行驶时,交通是如何工作的呢?如果在云中对数据进行了更改,您将如何得到通知?你需要订阅吗?

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

    好了,我算出来了。"简单"的例子,你所要做的就是将适配器:{type:'acs'}添加到你的对象定义中,以便将它同步到acs,这确实依赖于Aaron Saunders的示例代码。他最好的解释是:https://github.com/aaronksaunders/ci.alloy.adapter.two

    如果你想使用他的东西,基本上你只需要从他的项目复制两个文件到你自己的项目:应用程序/合金。jmk(这做了一些奇特的文件名重写,我不完全理解)App/assets/alloy/sync/acs.js(这是他的核心内容)

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

    最新更新