JSSDK: Model, Model.List
// Поиск модели
function find(id) {
var model = new XModel({ id: id, flag: false });
return model.fetch();
}
#!+ // Где-то в коде #1
find(123).then(function (model) {
model.on("change:flag", function () { // Слушаем событие
console.log(model.get("flag"));
});
#!- });
#!+ // Где-то #2
find(123).then(function (model) {
#! model.set("flag", true); // и ничего не происходит
#!- });
findAll().then(function (collection) {
#! collection.on("change", function () { });
#!+ collection
#! .where({ flag: true })
#!+ .on("change", function () {
#! // TypeError: undefined is not a function :[
#!- })
#!- ;
#! // Все методы с коллекцией возвращают массив :[
});
var Letter = Model.extend({
#! findUrl: "letters/all",
#! findOneUrl: "letters/letter",
#!+ defaults: {
prev: "",
next: "",
subject: "",
flags: {
unread: false,
flagged: false
}
#!- }
});
Letter.find({ folder: 1 }).then(function (models) {
#! models instanceof Letter.List; // true
#! models instanceof Letter.List; // true
#!+ // Получаем список всех id
#!- var ids = models.pluck("id");
});
Letter.findOne(req.params.id).then(function (model) {
#!+ if (model.is("flags.unread")) {
// Письмо непрочитанно, помечаем как прочитанное
return model.save("flags.unread", false);
#!- }
});
// Есть два месте, где запрашиваем одни и теже данные
#!+ Promise.all([Model.find(), Model.find()])
.then(function (results) {
#!+ var listA = results[0];
#!- var listB = results[1];
#!+ log(listA !== listB); // Коллекции разные
#!- log(listA[0] === listB[0]); // Но модели одинаковые
#!- });
var Letter = Model.extend({
url: "/letter/:id/"
});
Letter.find().then(function () { // GET /letter/
Letter.findOne( 123 ) // runtime cache
.then(function (model) {
log(model.get("body")); // undefined
});
});
var Letter = Model.extend({
url: "/letter/:id/",
#!+ isDataFully: function () {
#! return this.is("body");
#!- }
});
Letter.find().then(function () { // GET /letter/
#!+ Letter.findOne( 123 ) // GET /letter/123/
.then(function (model) {
log(model.get("body")); // "Пару дней назад я познакомился с..."
#!- });
});
#!+ // Расширяем модель для работы со RPC
var RPCModel = Model.extend({
request: RPC
#!- });
#!+ // Используем (+ Хранилище)
var Folder = RPCModel.extend({
storage: new Storage.Local("folders")
#!- });
mailbox/status
define(["RPC", "Folder", "Letter"], function (RPC, Folder, Letter) {
// Export: функция получения статуса ящика
return function () {
#!+ return RPC.call("mailbox/status").then(function (req) {
#!+ return req.map({
#! folders: Folder,
#! letters: Letter
#!- });
#!- });
};
});
Promise.all([
#! Folder.find(), // получаем все папки
#! Letter.findOne(123), // получаем письмо по id
#! Files.find({ letter_id: 123 }) // список файлов для письма
]).then(function (results) {
#!+ var folders = results[0];
var letter = results[1];
#!- var files = results[2];
});
#!+ Promise.map({
#! folders: Folder.find(),
#! letter: Letter.findOne(123),
#! files: Files.find({ letter_id: 123 })
}).then(function (data) {
#!+ data.folders; // список папок
data.letter; // письмо
#!- data.files; // список файлов
#!- });
RPC.batch(function () {
#!+ return Promise.map({
folders: Folder.find(),
letter: Letter.findOne(123),
files: Files.find({ letter_id: 123 })
#!- });
}).then(function (data) {
#!+ // POST /batch/
#!- // [{url:"/folders/",data:{}},..]
});