Skip to content

Instantly share code, notes, and snippets.

@sergeche
Created March 19, 2012 11:21
Show Gist options
  • Save sergeche/2108104 to your computer and use it in GitHub Desktop.
Save sergeche/2108104 to your computer and use it in GitHub Desktop.
Пример контроллера шагов
var StepModel = Backbone.Model.extend({
// шаблон для шага по умолчанию
template: 'steps/defaultTemplate',
initialize: function(data) {
// инициализруешь модель
// ...
// инициализация вьюхи
this.view = templates.render(data.template || this.template);
},
validate: function() {
// асинхронная валидация данных
},
/**
* Показывает текущий шаг
*/
show: function() {
// сама функция ничего не делает, а делегирует это коллекции
this.trigger('shouldShow');
},
/**
* Прячет текущий шаг
*/
hide: function() {
// сама функция ничего не делает, а делегирует это коллекции
this.trigger('shouldHide');
}
});
var StepsCollection = Backbone.Collection.extend({
model: StepModel, // отдельно делаешь модель шага
initialize: function() {
var that = this;
this
.on('shouldShow', function(step) {
that.showStep(step);
})
.on('shouldHide', function(step) {
that.showHide(step);
});
},
/**
* Добавляем новый шаг (или массив шагов) в коллекцию. Перекрываем
* существующий метод
*/
add: function (models, options) {
models = _.isArray(models) ? models.slice() : [models];
var modelClass = this.model;
// инициалищируем каждую модель делегата
var completeModels = [];
_.each(models, function(data, i) {
// тут инициализируешь шаг, как сейчас делаешь:
// смотришь, если ли предопределённый шаг, инициализируешь модель и т.д.
// если фабрика шага не вернула null, значит, добавляешь его в completeModels
});
// вызываешь основной метод, который добавляет готовые модели в коллекцию
this.__super__.add.call(this, completeModels, options);
},
showStep: function(step) {
// описываешь логику, согласно которой нужно показать указанный шаг
},
hideStep: function(step) {
// описываешь логику скрытия шага
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment