Синхронизируйте данные с Titanium ACS, используя Alloy и Backbone
Я разрабатываю приложение Titanium с событиями и задачами, и я хочу, чтобы они синхронизировались с облачным хранилищем, чтобы пользователь мог получить доступ к своим событиям и задачам из любого приложения или браузера, если они предоставят свой логин.
Похоже, что Appcelerator/Titanium делает все это очень легко, и все же они ужасно документируют это. Возможно, я не понимаю. Так может кто-нибудь подтвердить или исправить картинку, которую я нарисовал ниже?
Приложение Titanium Alloy позволяет создавать модели, определяя их в файлах JSON в папке /models. Если вы укажете свойство для этого объекта следующим образом:
adapter: {type:'acs'}
... тогда кажется, что Alloy будет хранить объект в ACS всякий раз, когда вы вызываете команду.save() для объекта.Чтобы это работало, вы, конечно, должны подключить свое приложение к ACS, что вы делаете, нажимая кнопку "Cloud-enable" в графическом интерфейсе tiapp.xml. И вам, конечно же, нужно убедиться, что приложение входит в ACS с определенной комбинацией имени пользователя и пароля.
Если я смотрю на свои источники с оптимизмом, это все, что вам нужно сделать. Эти источники:
Но потом я вижу, что все ссылаются на пример проекта Аарона Сондерса, в котором есть несколько пользовательских файлов, которые, похоже, построены поверх Alloy, чтобы сделать этот адаптер:{type:'acs'} вещь возможной. Чтобы понять, о чем я говорю, перейдите в папку app / assets /loy / sync и найдите там файл acs.js. Кроме того, в ответе на вопросы и ответы от Тони Лукасавжа год назад говорится, что в настоящее время нет встроенного адаптера синхронизации ACS для Alloy. Он указывает на проект Аарона Сондерса http://alloylove.com/ для решений.
Так, что происходит? Действительно ли все это встроено в Alloy/Backbone и просто нигде не задокументировано, и использует ли Аарон Сандерс встроенный материал для примера проекта, или мне нужно включить код Аарона в мой проект, чтобы все это работало?
Спасибо за любые советы! Wytze
Примечание для себя: также попробуйте этот пример, который требует создания нового проекта: https://wiki.appcelerator.org/display/td/11.+Storing+data+in+ACS
2 ответа
Я получил представление о синхронизации ACS Аарона Сондерса. Так как его README предполагает немного больше предварительных знаний, чем я имел, когда я начал, я решил поместить свое собственное маленькое руководство здесь для дальнейшего использования.
Прежде всего, вам необходимо понять сначала Backbone, а затем конкретную комбинацию Alloy и Backbone. Backbone позволяет вам создавать объектно-ориентированный Javascript: если ваше приложение полностью посвящено книгам, вы определяете, как должна выглядеть книга в целом. Вы можете назвать это классом, но Backbone называет это моделью. Без разницы.
По сути, Backbone превращает один объект Javascript в шаблон (модель), из которого вы можете создавать любое количество конкретных экземпляров. Создавая экземпляр этой модели (также объект Javascript), вы предоставляете этому объекту целый набор функциональных возможностей, например, возможность добавления прослушивателя событий, который срабатывает при любом изменении значения объекта.
Создание модели Backbone и ее экземпляров
Если вы не используете Alloy, способ создания модели Backbone будет:
var Book = Backbone.Model.extend({});
В этом примере вы вообще не добавляете никаких спецификаций. Таким образом, созданный шаблон / модель "Книга" получает множество функциональных возможностей Backbone, таких как возможность добавления прослушивателей событий, но ничего не настраивает самостоятельно.
Затем, используя new
Ключевое слово, вы можете создавать конкретные экземпляры этой модели, то есть конкретные книги. Подобно:
var myNewBook = new Book({title:"Moby Dick"}};
Сплав модели: файлы в приложении / модели
Теперь Alloy работает таким образом, что модели определяются в определенных файлах в папке app/models, а имя файла - это имя модели. Поэтому, если вы хотите создать модель Book способом Alloy, вы должны создать файл 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. Но сначала давайте попробуем создать объект Backbone в Javascript.
Создание объекта Backbone из модели Alloy
Теперь, когда вы хотите создать экземпляр модели Book, все, что вы делаете в своем коде, это использование Alloy.createModel
с правильным названием модели и словарем параметров. Вот так:
var oneBook = Alloy.createModel('Book',{title:"Moby Dick",pages:300});
Alloy будет искать файл "book.js" в папке app/models, использовать все свойства, определенные там, и возвращать объект Backbone с несколькими прикрепленными звонками и свистками Alloy.
(Обратите внимание, что Alloy кажется немного смущенным по поводу значения слова модель. Вы на самом деле не создаете модель, а создаете экземпляр модели. Или, может быть, я просто не понимаю)
Адаптер ACS
Решение Aaron Saunders для автоматизации синхронизации объектов Alloy/Backbone включает в себя адаптацию использования Alloy моделей магистралей. Вот почему вам нужно включить как минимум два файла из его проекта, чтобы все это работало:
- /app/assets/alloy/sync/acs.js (это "адаптер", который организует синхронизацию объектов Alloy/Backbone с ACS)
- app /loy.jmk (этот файл выполняет некоторую необходимую перезапись файловой системы при установке приложения)
Что происходит при установке этих файлов, так это то, что функциональность синхронизации Backbone теперь может использовать новый адаптер под названием "acs".
Магистральные модели имеют всевозможные дополнительные функции, включая синхронизацию объекта с хранилищем данных, таким как база данных SQLite или localStorage. Кроме того, Backbone позволяет программистам создавать "адаптеры", которые сообщают ему о необходимости синхронизации данных с пользовательским хранилищем данных.
Решение Aaron Saunders синхронизирует данные с ACS. Включив файл acs.js в соответствующую папку, вы убедились, что Backbone / Alloy будет использовать этот файл для организации синхронизации.
Взломанная часть
Поэтому, если вы определили модель Book как определено выше, и вы создали книгу в Javascript с помощью Alloy.createModel(), тогда 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. Но как работает трафик, когда вы хотите, чтобы он шел в другом направлении? Что, если в данные были внесены изменения, пока они находятся в облаке: как вы будете получать уведомления? Вам нужно подписаться?
что происходит, когда приложение находится в автономном режиме? Кешируются ли ваши ожидающие изменения данных до тех пор, пока приложение не будет снова подключено? Что произойдет, если приложение будет закрыто до того, как оно сможет синхронизировать кэшированные данные?
Хорошо, так что я понял это. "Простые" примеры, где все, что вам нужно сделать, это добавить адаптер: {type:'acs'} к определению вашего объекта, чтобы синхронизировать его с ACS, действительно зависит от примера кода Aaron Saunders. Его лучшее объяснение здесь: https://github.com/aaronksaunders/ci.alloy.adapter.two
Если вы хотите использовать его вещи, в основном вам просто нужно скопировать два файла из его проекта в ваш собственный проект: app /loy.jmk (это делает некоторую причудливую перезапись файлов, которую я не до конца понимаю) app / assets /loy / sync / acs.js (это ядро его вещей)
Это кажется мне многообещающим, но сейчас я думаю, что я просто буду создавать свои собственные объекты по-своему, а затем синхронизировать их с ACS, используя обычные методы Ti.Cloud.