Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Кстати, чем API кривовато?
В чем удобство? Теперь можем из любого места доступаться до этих данных, например где-то еще, в не связанном с первым блоком коде
var modelBase = {...}
var modelInherited = $.extend({}, modelBase, {extra-properties-for-child});
Давайте уже честно писать на функциональном языке функциями
Про глобальность — во-первых модели это не переменная, это API, доступ к моделям происходит через функции.
Как раз эта схожесть подхода катастрофически удобна, хотя и ломает стереотипы
app.models.loggedUser = {
// auto-added function, declared for readability
update: function(obj) {},
// model fields
firstName: function(val) {},
lastName: function(val) {},
id: function(val) {}
}
const User = Backbone.model.extend({
firstName: function() {..}
});
так как там приходится писать много избыточного кода на реализацию всех функций модели
book.set("title", "A Scandal in Bohemia");
book.title("A Scandal in Bohemia");
book.set(«title», «A Scandal in Bohemia»);
И вот за этими "..." внутри бэкбон функции скрывается тоже ведь строчка кода
user: {
add: function(obj) {},
name: function(val) {},
id: function(val) {}
}
env: {
author: function(val) {},
reviewer: function(val) {}
}
jiant.onUiBound(app, function($, app) {
var m = app.models;
// откуда-то получили, скажем с сервера данные об этих пользователях
m.env.author(m.user.add(authorData)[0]);
m.env.reviewer(m.user.add(reviewerData)[0]);
});
user: {
author: function() {return this.all()[0]},
reviewer: function() {return this.all()[1]}
}
....
m.user.add([author, reviewer]);
user: {
role: function(val) {},
findByRole: function(val) {}
}
....
m.user.add(...);
m.user.findByRole("author");
app.models.record.text.on(function(record, newText, oldText) {
...
}
const User = Backbone.Model.Extend({
url: '/users.json'
});
let author = new User(id); // можно передать obj
let reviewer = new User(id);
const User = Backbone.Model.Extend({
url: '/users.json',
events:
change: function(arg, old_val, new_val) { } // с точностью до аргументов
'change:name': () => {..} // следить за изменением только name
});
fullName: function() {return this.firstName + " " + this.lastName()}
app.ajax.doSearch(app.models.searchParams, callback);
// или
app.ajax.save(app.models.listing.all(), callback);
// или
app.ajax.save(app.models.listing.listByTp("some type"), callback);
Jiant. Модели для фронтенд приложения