【问题标题】:Sync data to Titanium ACS using Alloy and Backbone使用 Alloy 和 Backbone 将数据同步到 Titanium ACS
【发布时间】:2014-09-28 10:27:27
【问题描述】:

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

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

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

  2. 为了使其工作,您当然必须让您的应用程序连接到 ACS,您可以通过单击 tiapp.xml 图形界面中的“云启用”按钮。当然,您必须确保应用使用特定的用户名-密码组合登录 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

【问题讨论】:

    标签: backbone.js titanium-alloy appcelerator-acs


    【解决方案1】:

    我已经掌握了 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 对象。

    从合金模型创建 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 云。但是,当您希望交通流向另一个方向时,交通又是如何运作的呢?如果在云中对数据进行了更改怎么办:您将如何收到通知?需要订阅吗?

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

    【讨论】:

    • 我在你的轨道上有类似的问题 - 不过很好的解释!
    【解决方案2】:

    好的,所以我想通了。您所要做的就是将 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 2017-06-12
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多