-
Notifications
You must be signed in to change notification settings - Fork 1
/
has_one.coffee
96 lines (79 loc) · 2.48 KB
/
has_one.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
AS = require("alpha_simprini")
_ = require("underscore")
AS.Model.HasOne = AS.Model.Field.extend ({delegate, include, def, defs}) ->
def couldBe: (test) ->
return true if test in @options.model?().ancestors
@_super.apply(this, arguments)
# @::couldBe.doc =
# params: [
# ["test", undefined, true]
# ]
# desc: """
#
# """
AS.Model.HasOne.Instance = AS.Model.Field.Instance.extend ({def}) ->
def initialize: (@object, @options) ->
@options.model ?= -> AS.Model
@model = @options.model
@namespace = ".#{_.uniqueId()}"
@_super.apply(this, arguments)
@bind "destroy", => @set(null)
# @::initialize.doc =
# params: [
# ["@object", AS.Model, true]
# ["@options", Object, true]
# ]
# desc: """
#
# """
def get: ->
@value
# @::get.doc =
# return: [AS.Model, null]
# desc: """
#
# """
def set: (value) ->
value = value.model if value?.model
return @value if value is @value
if _.isString(value) and (konstructor = @model()) isnt AS.Model
value = konstructor.find(value)
else if _.isString(value)
value = AS.All.byId[value]
else if value instanceof AS.Model
value = value
else if _.isObject(value)
value = @options.model().new(value)
@value?.unbind(@namespace)
# TODO: test inverse
if @value and @options.inverse and @value[@options.inverse]
@value[@options.inverse].remove(@object) if @value[@options.inverse].include(@object).value()
@value = value
if @value and @options.inverse and @value[@options.inverse]
@value[@options.inverse].add(@object) unless @value[@options.inverse].include(@object).value()
# this looks neccessory for path bindings, but not so good for view bindings yeesh
# @value?.bind "all#{@namespace}", _.bind(@trigger, this)
@object.trigger("change")
@object.trigger("change:#{@options.name}")
@trigger("change")
@triggerDependants()
@value
# @::set.doc =
# params: [
# ["value", AS.Model]
# ]
# desc: """
#
# """
@Synapse = AS.Model.Field.Instance.Synapse.extend ({delegate, include, def, defs}) ->
def get: ->
@raw.get()
def set: (value) ->
@raw.set(value)
@ShareSynapse = AS.Model.Field.Instance.ShareSynapse.extend ({delegate, include, def, defs}) ->
def get: ->
@raw.at(@path).get()
def set: (value) ->
@_super(value?.id) if value?.id
AS.Model.defs hasOne: (name, options) ->
AS.Model.HasOne.new(name, this, options)