Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Sqimitive.Sqimitive используете единожды, а дальше вы упоминаете его только как App.MyBaseObject или App.Sqimitive (понятно, что ограничений тут никаких нет).var artist = App.model.Artist.getById({id: 25, cache: 1800});
, tracks = App.model.Track.List.getByArtistId({id: 25, limit: 80});
$.when(artist, tracks).than(function(artist, tracks) {
...
}
'getById': '/artist/:id'
return this.socket('artist/' + id)
Смотрели фреймворк canjs.com?
/**
* @add can.Component
*/
var Component = can.Component = can.Construct.extend(
// ## Static
/**
* @static
*/
{
Трюк в том, что при распределении работ в команде тебе достаточно знать интерфейс класса, и не задумываться как оно там внутри работает и выбирается.
Либо чуть более сложной конструкцией, с конкретизацией как тянем данные
Вопрос такой: что если мы наследуемся от метода, в котором уже реализован +, и в нашем тоже есть +. Они оба выполнятся или будет перекрытие?
extend() вы блок events берётся и передаётся в NewClass.on({events}). Это и есть наследование в стиле Sqimitive. Если есть желание, могу через скайп показать код пары проектов.
/**
* Get all issues for current department
* @static @public
* @param {string} params.type all|my
* @param {string} params.skip from start
* @return {object} $.Deferred -> models object
*/
getAll: function(params) {
if (params == undefined) {
params = {};
}
return this.socket('issue/list/'
+ App.user.curDepartment + '/'
+ (params.type == undefined ? 'my' : params.type) + '/'
+ (params.skip == undefined ? 0 : params.skip), {filter: params.filter});
}
На главной странице есть кнопка Costumize — бери что надо.
Не вижу причин атрибутов с датакастами, конвенторами данных и т.п. где-нибудь кроме моделей :-)
Ну так метод и реализуется в модели. Причем реализуется одной строкой, если не специфичный. В результате получаешь ощутимо меньше кода.
Накручивать абстракции вокруг базовых классов или бекэнд?
Большинство библиотек позволяют их модифицировать не мешая основному коду программы, тем самым получаем свою сборку, которая легко обновляется до более новых версий.
Бонусом является то, что код отлично оттестирован, в отличии от самописного.
Мне нравится подход, когда ты точно знаешь как что работает, и что происходит.
.е. на выходе имеет 1.5 тысячи строк для изучения. Уже не так страшно, да?
Просмотри ещё раз про state-based programming.
/**
* Change label and remove close buttons
* @event
* @param {object} issue changed issue model object
* @param {object} e Event
* @param {string} newVal new status value
*/
'{issue} status.updated': function(issue, e, newVal) {
this.element.find('#issueStatus')
.attr('class', 'label label-success')
.text(newVal)
.parent()
.effect("highlight", {}, 2000);
this.element.find('.closeIssue').remove();
},
А если у модели нет ID?
Если в твоём проекте/тебе удобно использовать виды, модели и коллекции
Хорошая библиотека не должна модифицироваться
но отдельный форк на каждый проект
Ты знаешь его настолько хорошо, чтобы лазить в нутрях
11.5к — это всё же разные степени «когда ты точно знаешь как что работает»
Но, насколько я понял, CanJS это около 6к?
Только тут такой момент — любые данные укладываются в модель. Исключения очень редки.
Ты же пишешь код не в самой библиотеке, а в подключаемом компоненте
Пойми меня правильно — это всё лишь инструменты, и каждый выбирает инструмент, который ему удобен.
модель на каждый вид — особенно если там 1-2 флага
Конечно, ошибки проектирования/опыта имели значение, но всё равно не решающее.
Что за вид? Можно пример кода, пожалуйста?
На главной странице есть кнопка Costumize — бери что надо.
var model = new MyModel
$.getJSON('api/route', _.bind(model.assignResp, model))
var model = new MyModel
// вызов 1:
$.getJSON('api/route', _.bind(model.assignResp_ajax, model))
// вызов 2 (формат чуть отличается):
pusher_channel.bind('my-event', function(data) {
model.assignResp_pusher(data);
});
А если для одной и той же модели данные приходят из разных мест в разных форматах, как это лавировать?
assignResp(resp, {map: resp-to-opt}).Другая особенность JavaScript — отсутствие в языке ссылки на базовый класс и вообще понятия «базового класса». JavaScript использует прототипное наследование, что в общем означает следующее: каждая функция (она же конструктор, который вы вызываете как new Func) имеет так называемый «прототип». При new Func происходит копирование полей этого прототипа в новый экземпляр объекта. «Наследование» в понятиях традиционного ООП — отсутствует, вместо этого прототип копируется в другой прототип, то есть все его поля копируются в другой объект: переменные и методы-функции — которые, как уже сказано, обычные значения, которыми можно манипулировать. Затем на новом прототипе делаются все изменения, которые предписывает «наследование» (перекрываются методы, добавляются поля и т.п.).
Фактически же мы получаем два независимых класса-прототипа.
вместо этого прототип копируется в другой прототип, то есть все его поля копируются в другой объек
Sqimitive.js — Frontend Primitive или «Backbone без фантиков»