Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
… создавая сложные джаваскрипт-приложения, уже решает эту проблему каким-то определенным образом без фреймворков
var Note = new Model('Note', function () {
this.attr('id!', 'number');
this.attr('title', 'string', 'nonempty');
this.attr('text', 'string');
});
var Note = new Model({
'id!' : 'number',
'title': {
type: 'string' // или String
validator: 'non-empty'
},
'text': 'string'
});
note.bind(eventName, handler) «вешает» обработчик. Кстати говоря, повесить обработчик любого события можно не только на отдельную сущность, но и на все сущности класса (Note.bind).
this.attr('title', 'string', 'nonempty', [ 'minLength', 6 ]);
this.attr(attrName, validator[, validator, …])
, но в будущем появятся и другие методы, при помощи которых будет описываться модель. Например, this.validates(function () {…})
, которая должна бы валидировать модель вцелом после проверки значений атрибутов. Есть и другие задумки.this.attr('title', 'nonnull', 'string', 'nonempty', [ 'minLength', 6 ]);
nonempty
и [ 'minLength', 6 ]
стоят рядом может иметь в нашем приложении специальный смысл (я имею ввиду, что в принципе nonempty
можно и не указывать рядом с [ 'minLength', 6 ]
).minLength
или in
.var Note = new Model({
'id!' : 'number',
'title': [ 'nonnull', 'string', 'non-empty', [ 'minLength', 6 ] ],
'text': 'string'
});
this.attr
все же предпочтительней.bind
, то он стал стандартным только в JS 1.8.5 (в современных браузерах с марта 2011 года, начиная с ФФ4), в то время, как Model.js нацелена на JS 1.5 (c ноября 2000 года в абсолютном большинство современных браузеров). Но вы правы, в будущем этому нюансу стоит уделить больше внимания. А пока, в ближайших версиях, возможно, и стоит создать алиас на слово on
, которое сделали популярным последние версии jQuery и Backbone.var Note = new Model({
'text': {
'name' : {
type: 'string',
validators: []
}
}
});
var Note = new Model('Note', function () {
}).attr('id!', 'number').validates(...)
По поводу метода bind, то он стал стандартным только в JS 1.8.5 (в современных браузерах с марта 2011 года, начиная с ФФ4), в то время, как Model.js нацелена на JS 1.5
__proto__
, __defineGetter__
и __defineSetter__
нестандартным в JS 1.5 есть только __proto__
. Присмотритесь к коду. Использование __proto__
в 2 местах — это всего лишь перестраховка от кое-каких особенностей современных браузеров: если вообще удалить __proto__
, смысл не пострадает, но вот в последних хромах (напр. версии 24.0.1312.70) прототипная цепочка почему-то не установится (слетит ровно 75 тестов). cls.prototype = cls.__proto__ = private.Class.prototype;
JavaScript writers can now add getters and setters to their objects. This feature is available only in the C implementation of JavaScript.developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.5
ведь чтобы ей стать «взрослой» библиотекой, нужно проделать еще немало работыЧто бы ей в конце-концов стать backbone.js надо действительно проделать немало работы
var Author = new Model('Author', function () {…});
var Comment = new Model('Comment', function () {
this.attr('author', function (author) {
if (author.constructor.className != 'Author') return 'wrongtype';
});
this.attr('text', 'string');
});
var Author = new Model('Author', function () {…});
var Comment = new Model('Comment', function () {
this.attr('author', 'Author');
this.attr('text', 'string');
});
var note = this;
return $.ajax({
type: 'PUT',
url: '/notes/'+this.data.id,
data: this.data(),
dataType: 'json'
}).done(function (json) {
note._persist();
});
return $.ajax({
type: 'PUT',
url: '/notes/'+note.data.id,
data: note.data(),
dataType: 'json',
context: this,
}).done(function (json) {
this._persist();
});
Работа с моделями данных в javascript