Advertisement
Serafim

Untitled

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