Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- namespace window:Jsc:ArJs: ->
- @Model = abstract class @Model
- private: {}
- primaryKey: 'id'
- constructor: (data) ->
- if !data? then throw new Exception 'Отсутствуют параметры конструктора модели'
- $.extend @, ko.mapping.fromJS data
- @[@primaryKey].subscribe (newval) =>
- print "Jsc Fatal Error: Primary key \"#{@primaryKey}\" (#{data.id} => #{newval}) " +
- "for model \"#{@model.name}\" has been changed. Это влечёт к полному фейлу индексации данных.", "#900"
- # Установка данных (из массива объектов)
- @setup: (data) ->
- if !@::private[@::model.name]?
- @::private[@::model.name] = {
- properties: {}
- index: []
- }
- for i in data
- @::private[@::model.name].properties[i[@::primaryKey]] = new Models[@::model.name](i)
- @::private[@::model.name].index.push i.id
- return @
- @where: (conditions, args) ->
- return (new Jsc.ArJs.QueryBuilder(@::private[@::model.name].properties)).where(conditions, args)
- # Вернуть по primaryKey
- @find: (pk) ->
- if pk is 'all' then return @all()
- if pk is 'first' then return @first()
- if pk is 'last' then return @last()
- return @::private[@::model.name].properties[pk]
- # Вернуть по: Поле|Значение
- @findBy: (type, val) ->
- return @where("#{type}=%1", [val]).get()
- # Вернуть всё
- @all: ->
- return @::private[@::model.name].properties
- # Вернуть первое
- @first: ->
- for i of @::private[@::model.name].properties
- return @::private[@::model.name].properties[i]
- # Вернуть последнее (задействует индекс)
- @last: ->
- for i of @::private[@::model.name].index.reverse()
- return @::private[@::model.name].properties[@::private[@::model.name].index[i]]
- # Смержить данные с моделью
- # Example:
- # Item.join('id', 'count', {27:2, 29:30})
- # // Добавляет в объекты модели "Item" поле "count", где
- # // 27 - "id" существующего объекта, а 2 - значение для "count"
- # // 29 - "id" существующего объекта, а 30 - значение для "count"
- # // для всего остального устанавливается значение 0
- @join: (index, value, data) ->
- for i of @::private[@::model.name].properties
- obj = @::private[@::model.name].properties[i]
- if data[obj[index]()]?
- obj[value] = ko.mapping.fromJS data[i]
- else
- obj[value] = ko.mapping.fromJS 0
- return @
- # Клонировать данные модели
- @clone: ->
- data = []
- for i of @::private[@::model.name].properties
- obj = @::private[@::model.name].properties[i]
- obj = ko.mapping.toJS obj
- delete obj.constructor
- data.push new @::model.proto(obj)
- return data
- # Клонировать текущий объект
- clone: ->
- return new @model.proto @serialize().toJs()
- # Сериализация инстанса
- serialize: ->
- return {
- toJs: =>
- obj = ko.mapping.toJS @private[@model.name].properties[@[@primaryKey]()]
- delete obj.constructor
- return obj
- toJson: =>
- obj = ko.mapping.toJSON @private[@model.name].properties[@[@primaryKey]()]
- delete obj.constructor
- return obj
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement