Skip to content

Instantly share code, notes, and snippets.

@RubaXa
Created December 16, 2014 11:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RubaXa/274b1dd5c813c8ee7af3 to your computer and use it in GitHub Desktop.
Save RubaXa/274b1dd5c813c8ee7af3 to your computer and use it in GitHub Desktop.
Pilot v2 (draft)
/**
* Pilot v2 (draft)
* - Не зависит от jQuery
* - Модульность (URL, history, Emitter)
* - Простота (один маршрут, один контроллер)
*/
var app = {
// Глобальная дата
model: {
folders: function () {
return Folders.find();
},
folder: {
match: ['#letters', '#letter'],
defaults: null,
load: function (req) {
var id = req.params.id;
if (req.is('letters')) {
return Folder.findOne(id);
} else {
return Letter.findOne($.extend(req.query, { id: id })).then(function (letter) {
return Folder.findOne(letter.get('folder'));
});
}
}
},
letters: {
match: ['#mailbox'],
defaults: [],
load: function (req) {
return Letters.find({offset: req.query.offset});
}
}
},
// Слушать любое изменение маршрута
'*': {
// Список папок
folderList: {
match: ['#letters', '#letter'], // сужаем список маршрутов, на которые реагируем
'on:route': function () { }
}
},
// Список писем
'#letters': {
url: '/messages/(folder/:id|:type)?',
urlBuilder: function (url, params) {
if (!(params instanceof Object)) {
params = params >= 0 ? { id: params } : { type: params };
}
return Pilot.URL.build(url, params);
},
paramsMatcher: {
type: function (value, req) {
req.param('id', Folder['TYPE_' + value.toUpperCase()] || Folder.TYPE_INBOX);
}
},
'on:route': function (req) {
var folder = this.model.folder,
letters = this.model.letters;
// ..
},
'on:404': function () {
// ...
}
},
// Чтение
'#letter': {
url: '/message/:id',
paramsMatcher: {
'?': {
validator: function (query) {
return !!query.fromsearch
}
}
},
model: {
letter: function (req) {
return Letter.findOne(req.params.id);
}
},
'on-route': function () {
var letter = this.model.letter;
// ..
}
},
// Настройки
'#settings': {
url: '/settings/',
'on:route': function () {},
'*': {
navigation: {
events: {
'gotoinbox': function () {
this.router.go('#letters', 'inbox');
}
},
'on:route': function () {
var section = this.router.route.id.split('.').pop();
// ...
}
}
},
'#settings.folders': {
url: 'folders',
'on-route': function () {}
}
}
};
var cloud = {
'#entries': {
url: '/:storage/:id(.+)',
model: {
entries: {
load: function (req) {
return CloudEntry.findOne(req.params.id).then(function (entry) {
var folderId = entry.isFile() ? entry.get('parent') : entry.id;
return CloudEntry.find(folderId);
});
},
compare: function (newEntry, oldEntry) {
return newEntry.id != oldEntry.id;
}
}
},
'on:route': function () {
var entries = this.model.entries;
// ..
}
},
'#entry': {
url: '#entries',
urlMatcher: {
id: {
validator: function (value) {
return this.loadEntry(value).then(function (entry) {
return entry.isFile();
});
}
}
},
model: {
entry: function (req) {
return this.loadEntry(req.params.id);
}
},
loadEntry: function (id) {
return CloudEntry.findOne(id);
},
events: {
'close': function () {
this.router.history.rewindTo('entry');
}
},
'on:route-before-start': function () {
this.router.history.mark('entry');
}
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment