JSFiddle - React, Tailwind, and code Playground
by Proger
HTML
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js"></script>
<script src="http://squizzle.me/js/sqimitive/sqimitive.min.js"></script>
JavaScript
var MyModel = Sqimitive.Sqimitive.extend({
_opt: {
id: 0,
date: new Date,
parents: [],
caption: '',
},
// Мы можем и полностью переписать сам assignResp для этого класса, но
// намного проще настроить его поведение с помощью этого блока.
_respToOpt: {
// Простое переименование исходного ключа.
thisID: 'id',
// Произвольное сложное преобразование. Функция возвращает массив, где
// первый элемент - имя конечной опции, а значение - значение опции для присвоения.
date: function (str) {
return ['date', new Date(str)]
},
// Игнорирование ключа.
junk: false,
parents: function (str) {
return ['parents', str.split(/\s+/)]
},
// Принятия ключа/значения как есть. Аналогично caption: 'caption'.
caption: true,
},
// Всё, что ниже - не обязательно, но поможет поддерживать значения в чистоте.
normalize_id: function (value) {
var id = parseInt(value)
if (isNaN(id)) { throw 'What kind of ID is that?' }
return id
},
normalize_parents: function (value) {
return _.map([].concat(value), this.normalize_id, this)
},
normalize_caption: function (value) {
return value.replace(/^\s+|\s+$/g, '')
},
})
var model = new MyModel
model.assignResp({
'thisID': 123,
'date': '2014-10-03T10:26:22+03:00',
'parents': '1 2 3',
'junk': 'ONk49Xo3SxEps8uCV9je',
'caption': 'Имя',
})
$('body').text(JSON.stringify(model.get()))