-
Notifications
You must be signed in to change notification settings - Fork 1
/
view_model.coffee
112 lines (97 loc) · 2.69 KB
/
view_model.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
AS.ViewModel = AS.Object.extend ({delegate, include, def, defs}) ->
delegate 'readPath', 'writePath', to: 'model'
defs build: (view, model) ->
constructor = AS.ViewModel.constructorForModel(model.constructor)
constructor.new(view, model)
defs constructorForModel: (model) ->
return AS.ViewModel[model.path()] if AS.ViewModel[model.path()]
klass = AS.ViewModel[model.path()] = AS.ViewModel.extend()
klass.name = model.name
klass::type = model._name()
klass.bindables = {}
klass.extended_by = model.extended_by
for name, property of model.properties
klass.bindables[name] = switch property.constructor
when AS.Model.Field, Pathology.Property, Taxi.Property, AS.Model.VirtualProperty
AS.Binding.Field
when AS.Model.BelongsTo, AS.Model.HasOne
AS.Binding.One
when AS.Model.HasMany
AS.Binding.Many
for method in AS.instanceMethods(model)
continue if _.include _.keys(Pathology.Object::), method
do (method) =>
# FIXME: shouldn't be checking for specific conflicting methods here.
if method is 'select'
klass::[method] = -> @model[method].apply(@model, arguments)
klass::[method] ?= -> @model[method].apply(@model, arguments)
return klass
def initialize: (@view, @model) ->
@cid = @model.cid
@id = @model.id
@model.bind("change:id", (=> @id = @model.id))
for key, config of @model.constructor.properties
@[key] = @model[key]
# @::initialize.doc =
# params: [
# []
# ]
# desc: """
#
# """
def binding: (field, options, fn) ->
if _.isFunction(options)
[fn, options] = [options, {}]
@constructor.bindables[field].new(@view, @model, @model[field], options, fn)
# @::binding.doc =
# params: [
# []
# ]
# desc: """
#
# """
def input: (field, options) ->
AS.Binding.Input.new(@view, @model, field, options)
# @::input.doc =
# params: [
# []
# ]
# desc: """
#
# """
def file: (field, options) ->
AS.Binding.File.new(@view, @model, field, options)
# @::file.doc =
# params: [
# []
# ]
# desc: """
#
# """
def checkbox: (field, options) ->
AS.Binding.CheckBox.new(@view, @model, field, options)
# @::checkbox.doc =
# params: [
# []
# ]
# desc: """
#
# """
def select: (field, options) ->
AS.Binding.Select.new(@view, @model, field, options)
# @::select.doc =
# params: [
# []
# ]
# desc: """
#
# """
def editline: (field, options) ->
AS.Binding.EditLine.new(@view, @model, field, options)
# @::editline.doc =
# params: [
# []
# ]
# desc: """
#
# """