Advertisement
Serafim

Untitled

Aug 16th, 2013
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. namespace window:Jsc:ArJs: ->
  2.   @Model = abstract class @Model
  3.     private: {}
  4.  
  5.     primaryKey: 'id'
  6.  
  7.     constructor: (data) ->
  8.       if !data? then throw new Exception 'Отсутствуют параметры конструктора модели'
  9.       $.extend @, ko.mapping.fromJS data
  10.       @[@primaryKey].subscribe (newval) =>
  11.         print "Jsc Fatal Error: Primary key \"#{@primaryKey}\" (#{data.id} => #{newval}) " +
  12.           "for model \"#{@model.name}\" has been changed. Это влечёт к полному фейлу индексации данных.", "#900"
  13.  
  14.     # Установка данных (из массива объектов)
  15.     @setup: (data) ->
  16.       if !@::private[@::model.name]?
  17.         @::private[@::model.name] = {
  18.           properties: {}
  19.           index: []
  20.         }
  21.       for i in data
  22.         @::private[@::model.name].properties[i[@::primaryKey]] = new Models[@::model.name](i)
  23.         @::private[@::model.name].index.push i.id
  24.       return @
  25.  
  26.     @where: (conditions, args) ->
  27.       return (new Jsc.ArJs.QueryBuilder(@::private[@::model.name].properties)).where(conditions, args)
  28.  
  29.     # Вернуть по primaryKey
  30.     @find: (pk) ->
  31.       if pk is 'all' then   return @all()
  32.       if pk is 'first' then return @first()
  33.       if pk is 'last' then  return @last()
  34.       return @::private[@::model.name].properties[pk]
  35.  
  36.     # Вернуть по: Поле|Значение
  37.     @findBy: (type, val) ->
  38.       return @where("#{type}=%1", [val]).get()
  39.  
  40.     # Вернуть всё
  41.     @all: ->
  42.       return @::private[@::model.name].properties
  43.  
  44.     # Вернуть первое
  45.     @first: ->
  46.       for i of @::private[@::model.name].properties
  47.         return @::private[@::model.name].properties[i]
  48.  
  49.     # Вернуть последнее (задействует индекс)
  50.     @last: ->
  51.       for i of @::private[@::model.name].index.reverse()
  52.         return @::private[@::model.name].properties[@::private[@::model.name].index[i]]
  53.  
  54.     # Смержить данные с моделью
  55.     # Example:
  56.     #   Item.join('id', 'count', {27:2, 29:30})
  57.     #   // Добавляет в объекты модели "Item" поле "count", где
  58.     #   // 27 - "id" существующего объекта, а 2 - значение для "count"
  59.     #   // 29 - "id" существующего объекта, а 30 - значение для "count"
  60.     #   // для всего остального устанавливается значение 0
  61.     @join: (index, value, data) ->
  62.       for i of @::private[@::model.name].properties
  63.         obj = @::private[@::model.name].properties[i]
  64.         if data[obj[index]()]?
  65.           obj[value] = ko.mapping.fromJS data[i]
  66.         else
  67.           obj[value] = ko.mapping.fromJS 0
  68.       return @
  69.  
  70.     # Клонировать данные модели
  71.     @clone: ->
  72.       data = []
  73.       for i of @::private[@::model.name].properties
  74.         obj = @::private[@::model.name].properties[i]
  75.         obj = ko.mapping.toJS obj
  76.         delete obj.constructor
  77.         data.push new @::model.proto(obj)
  78.       return data
  79.  
  80.     # Клонировать текущий объект
  81.     clone: ->
  82.       return new @model.proto @serialize().toJs()
  83.  
  84.     # Сериализация инстанса
  85.     serialize: ->
  86.       return {
  87.         toJs: =>
  88.           obj = ko.mapping.toJS @private[@model.name].properties[@[@primaryKey]()]
  89.           delete obj.constructor
  90.           return obj
  91.         toJson: =>
  92.           obj = ko.mapping.toJSON @private[@model.name].properties[@[@primaryKey]()]
  93.           delete obj.constructor
  94.           return obj
  95.       }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement