Upgrade to spinejs 1.4.1.
This commit is contained in:
parent
04480db9aa
commit
acc6f606f8
4 changed files with 83 additions and 98 deletions
|
@ -213,18 +213,15 @@ class Singleton extends Base
|
|||
|
||||
Ajax.disable =>
|
||||
unless Spine.isBlank(data) or @record.destroyed
|
||||
# ID change, need to do some shifting
|
||||
if data.id and @record.id isnt data.id
|
||||
@record.changeID(data.id)
|
||||
# Update with latest data
|
||||
@record.refresh(data)
|
||||
|
||||
@record.trigger('ajaxSuccess', data, status, xhr)
|
||||
@record.trigger('ajaxSuccess', @record, @model.fromJSON(data), status, xhr)
|
||||
options.done?.apply(@record)
|
||||
|
||||
failResponse: (options = {}) =>
|
||||
(xhr, statusText, error) =>
|
||||
@record.trigger('ajaxError', xhr, statusText, error)
|
||||
@record.trigger('ajaxError', @record, xhr, statusText, error)
|
||||
options.fail?.apply(@record)
|
||||
|
||||
# Ajax endpoint
|
||||
|
@ -265,7 +262,7 @@ Model.Ajax =
|
|||
|
||||
ajaxChange: (record, type, options = {}) ->
|
||||
return if options.ajax is false
|
||||
record.ajax()[type](options.ajax, options)
|
||||
record.ajax()[type]?(options.ajax, options)
|
||||
|
||||
Model.Ajax.Methods =
|
||||
extended: ->
|
||||
|
|
|
@ -22,23 +22,23 @@ class ValueSetter
|
|||
getter element
|
||||
|
||||
_standardGetter: (element) ->
|
||||
self = @
|
||||
self["_#{element.attr("type")}Get"]?(element) || element.val()
|
||||
self = this
|
||||
self["_#{element.attr('type')}Get"]?(element) || element.val()
|
||||
|
||||
_standardSetter: (element, value) ->
|
||||
self = @
|
||||
self = this
|
||||
element.each ->
|
||||
el = $(this)
|
||||
self["_#{el.attr("type")}Set"]?(el, value) || el.val(value)
|
||||
self["_#{el.attr('type')}Set"]?(el, value) || el.val(value)
|
||||
|
||||
_checkboxSet: (element, value) ->
|
||||
if value
|
||||
element.prop("checked", "checked")
|
||||
element.prop('checked', 'checked')
|
||||
else
|
||||
element.prop("checked", "")
|
||||
element.prop('checked', '')
|
||||
|
||||
_checkboxGet: (element) ->
|
||||
element.is(":checked")
|
||||
element.is(':checked')
|
||||
|
||||
BindingsInstance =
|
||||
|
||||
|
|
|
@ -69,11 +69,8 @@ class Instance extends Spine.Module
|
|||
for key, value of options
|
||||
@[key] = value
|
||||
|
||||
exists: ->
|
||||
return if @record[@fkey] then @model.exists(@record[@fkey]) else false
|
||||
|
||||
find: ->
|
||||
return @model.find(@record[@fkey])
|
||||
@model.find(@record[@fkey])
|
||||
|
||||
update: (value) ->
|
||||
return this unless value?
|
||||
|
|
|
@ -6,7 +6,7 @@ Released under the MIT License
|
|||
Events =
|
||||
bind: (ev, callback) ->
|
||||
evs = ev.split(' ')
|
||||
@_callbacks = {} unless @hasOwnProperty('_callbacks') and @_callbacks
|
||||
@_callbacks or= {} unless @hasOwnProperty('_callbacks')
|
||||
for name in evs
|
||||
@_callbacks[name] or= []
|
||||
@_callbacks[name].push(callback)
|
||||
|
@ -19,11 +19,10 @@ Events =
|
|||
|
||||
trigger: (args...) ->
|
||||
ev = args.shift()
|
||||
list = @hasOwnProperty('_callbacks') and @_callbacks?[ev]
|
||||
list = @_callbacks?[ev]
|
||||
return unless list
|
||||
for callback in list
|
||||
if callback.apply(this, args) is false
|
||||
break
|
||||
break if callback.apply(this, args) is false
|
||||
true
|
||||
|
||||
listenTo: (obj, ev, callback) ->
|
||||
|
@ -37,11 +36,11 @@ Events =
|
|||
obj.bind ev, handler = ->
|
||||
idx = -1
|
||||
for lt, i in listeningToOnce when lt.obj is obj
|
||||
idx = i if lt.ev is ev and lt.callback is callback
|
||||
idx = i if lt.ev is ev and lt.callback is handler
|
||||
obj.unbind(ev, handler)
|
||||
listeningToOnce.splice(idx, 1) unless idx is -1
|
||||
callback.apply(this, arguments)
|
||||
listeningToOnce.push {obj, ev, callback, handler}
|
||||
listeningToOnce.push {obj, ev, callback: handler}
|
||||
this
|
||||
|
||||
stopListening: (obj, events, callback) ->
|
||||
|
@ -49,7 +48,7 @@ Events =
|
|||
for listeningTo in [@listeningTo, @listeningToOnce]
|
||||
continue unless listeningTo
|
||||
for lt in listeningTo
|
||||
lt.obj.unbind(lt.ev, lt.handler or lt.callback)
|
||||
lt.obj.unbind(lt.ev, lt.callback)
|
||||
@listeningTo = undefined
|
||||
@listeningToOnce = undefined
|
||||
|
||||
|
@ -60,16 +59,18 @@ Events =
|
|||
for ev in events
|
||||
for idx in [listeningTo.length-1..0]
|
||||
lt = listeningTo[idx]
|
||||
continue if callback and (lt.handler or lt.callback) isnt callback
|
||||
continue unless lt.obj is obj
|
||||
continue if callback and lt.callback isnt callback
|
||||
if (not ev) or (ev is lt.ev)
|
||||
lt.obj.unbind(lt.ev, lt.handler or lt.callback)
|
||||
lt.obj.unbind(lt.ev, lt.callback)
|
||||
listeningTo.splice(idx, 1) unless idx is -1
|
||||
else if ev
|
||||
evts = lt.ev.split(' ')
|
||||
if ev in evts
|
||||
evts = (e for e in evts when e isnt ev)
|
||||
lt.ev = $.trim(evts.join(' '))
|
||||
lt.obj.unbind(ev, lt.handler or lt.callback)
|
||||
lt.obj.unbind(ev, lt.callback)
|
||||
this
|
||||
|
||||
unbind: (ev, callback) ->
|
||||
if arguments.length is 0
|
||||
|
@ -132,6 +133,7 @@ class Module
|
|||
|
||||
class Model extends Module
|
||||
@extend Events
|
||||
@include Events
|
||||
|
||||
@records : []
|
||||
@irecords : {}
|
||||
|
@ -158,21 +160,20 @@ class Model extends Module
|
|||
|
||||
@exists: (id) -> Boolean @irecords[id]
|
||||
|
||||
@addRecord: (record, options = {}) ->
|
||||
if record.id and @irecords[record.id]
|
||||
@irecords[record.id].remove(options)
|
||||
record = @irecords[record.id].load(record) unless options.clear
|
||||
@addRecord: (record) ->
|
||||
if root = @irecords[record.id or record.cid]
|
||||
root.refresh(record)
|
||||
else
|
||||
record.id or= record.cid
|
||||
@irecords[record.id] ?= record
|
||||
@irecords[record.cid] ?= record
|
||||
@irecords[record.id] = @irecords[record.cid] = record
|
||||
@records.push(record)
|
||||
record
|
||||
|
||||
@refresh: (values, options = {}) ->
|
||||
@deleteAll() if options.clear
|
||||
|
||||
records = @fromJSON(values)
|
||||
records = [records] unless isArray(records)
|
||||
@addRecord(record, options) for record in records
|
||||
@addRecord(record) for record in records
|
||||
@sort()
|
||||
|
||||
result = @cloneArray(records)
|
||||
|
@ -248,10 +249,13 @@ class Model extends Module
|
|||
@toJSON: ->
|
||||
@records
|
||||
|
||||
@beforeFromJSON: (objects) -> objects
|
||||
|
||||
@fromJSON: (objects) ->
|
||||
return unless objects
|
||||
if typeof objects is 'string'
|
||||
objects = JSON.parse(objects)
|
||||
objects = @beforeFromJSON(objects)
|
||||
if isArray(objects)
|
||||
for value in objects
|
||||
if value instanceof this
|
||||
|
@ -329,13 +333,13 @@ class Model extends Module
|
|||
unless options.validate is false
|
||||
error = @validate()
|
||||
if error
|
||||
@trigger('error', error)
|
||||
@trigger('error', this, error)
|
||||
return false
|
||||
|
||||
@trigger('beforeSave', options)
|
||||
@trigger('beforeSave', this, options)
|
||||
record = if @isNew() then @create(options) else @update(options)
|
||||
@stripCloneAttrs()
|
||||
@trigger('save', options)
|
||||
@trigger('save', record, options)
|
||||
record
|
||||
|
||||
stripCloneAttrs: ->
|
||||
|
@ -375,14 +379,13 @@ class Model extends Module
|
|||
|
||||
destroy: (options = {}) ->
|
||||
options.clear ?= true
|
||||
@trigger('beforeDestroy', options)
|
||||
@trigger('beforeDestroy', this, options)
|
||||
@remove(options)
|
||||
@destroyed = true
|
||||
# handle events
|
||||
@trigger('destroy', options)
|
||||
@trigger('change', 'destroy', options)
|
||||
if @listeningTo
|
||||
@stopListening()
|
||||
@trigger('destroy', this, options)
|
||||
@trigger('change', this, 'destroy', options)
|
||||
@stopListening() if @listeningTo
|
||||
@unbind()
|
||||
this
|
||||
|
||||
|
@ -392,7 +395,9 @@ class Model extends Module
|
|||
delete atts.id
|
||||
else
|
||||
atts.cid = @cid
|
||||
new @constructor(atts)
|
||||
record = new @constructor(atts)
|
||||
@_callbacks and record._callbacks = @_callbacks unless newRecord
|
||||
record
|
||||
|
||||
clone: ->
|
||||
createObject(this)
|
||||
|
@ -403,12 +408,16 @@ class Model extends Module
|
|||
@load(original.attributes())
|
||||
original
|
||||
|
||||
refresh: (data) ->
|
||||
refresh: (atts) ->
|
||||
atts = @constructor.fromJSON(atts)
|
||||
# ID change, need to do some shifting
|
||||
if atts.id and @id isnt atts.id
|
||||
@changeID(atts.id)
|
||||
# go to the source and load attributes
|
||||
root = @constructor.irecords[@id]
|
||||
root.load(data)
|
||||
@trigger('refresh')
|
||||
@
|
||||
@constructor.irecords[@id].load(atts)
|
||||
@trigger('refresh', this)
|
||||
@trigger('change', this, 'refresh')
|
||||
this
|
||||
|
||||
toJSON: ->
|
||||
@attributes()
|
||||
|
@ -438,7 +447,7 @@ class Model extends Module
|
|||
# Private
|
||||
|
||||
update: (options) ->
|
||||
@trigger('beforeUpdate', options)
|
||||
@trigger('beforeUpdate', this, options)
|
||||
|
||||
records = @constructor.irecords
|
||||
records[@id].load @attributes()
|
||||
|
@ -446,12 +455,12 @@ class Model extends Module
|
|||
@constructor.sort()
|
||||
|
||||
clone = records[@id].clone()
|
||||
clone.trigger('update', options)
|
||||
clone.trigger('change', 'update', options)
|
||||
clone.trigger('update', clone, options)
|
||||
clone.trigger('change', clone, 'update', options)
|
||||
clone
|
||||
|
||||
create: (options) ->
|
||||
@trigger('beforeCreate', options)
|
||||
@trigger('beforeCreate', this, options)
|
||||
@id or= @cid
|
||||
|
||||
record = @dup(false)
|
||||
|
@ -459,48 +468,31 @@ class Model extends Module
|
|||
@constructor.sort()
|
||||
|
||||
clone = record.clone()
|
||||
clone.trigger('create', options)
|
||||
clone.trigger('change', 'create', options)
|
||||
clone.trigger('create', clone, options)
|
||||
clone.trigger('change', clone, 'create', options)
|
||||
clone
|
||||
|
||||
bind: (events, callback) ->
|
||||
@constructor.bind events, binder = (record) =>
|
||||
if record && @eql(record)
|
||||
callback.apply(this, arguments)
|
||||
# create a wrapper function to be called with 'unbind' for each event
|
||||
for singleEvent in events.split(' ')
|
||||
do (singleEvent) =>
|
||||
@constructor.bind "unbind", unbinder = (record, event, cb) =>
|
||||
if record && @eql(record)
|
||||
return if event and event isnt singleEvent
|
||||
return if cb and cb isnt callback
|
||||
@constructor.unbind(singleEvent, binder)
|
||||
@constructor.unbind("unbind", unbinder)
|
||||
this
|
||||
bind: ->
|
||||
record = @constructor.irecords[@id] or this
|
||||
Events.bind.apply record, arguments
|
||||
|
||||
one: (events, callback) ->
|
||||
@bind events, handler = =>
|
||||
@unbind(events, handler)
|
||||
callback.apply(this, arguments)
|
||||
one: ->
|
||||
record = @constructor.irecords[@id] or this
|
||||
Events.one.apply record, arguments
|
||||
|
||||
trigger: (args...) ->
|
||||
args.splice(1, 0, this)
|
||||
@constructor.trigger(args...)
|
||||
unbind: ->
|
||||
record = @constructor.irecords[@id] or this
|
||||
Events.unbind.apply record, arguments
|
||||
|
||||
listenTo: -> Events.listenTo.apply @, arguments
|
||||
listenToOnce: -> Events.listenToOnce.apply @, arguments
|
||||
stopListening: -> Events.stopListening.apply @, arguments
|
||||
|
||||
unbind: (events, callback) ->
|
||||
if arguments.length is 0
|
||||
@trigger('unbind')
|
||||
else if events
|
||||
for event in events.split(' ')
|
||||
@trigger('unbind', event, callback)
|
||||
trigger: ->
|
||||
Events.trigger.apply this, arguments # fire off the instance event
|
||||
return true if arguments[0] is 'refresh' # Don't trigger refresh events, because ... ?
|
||||
@constructor.trigger arguments... # fire off the class event
|
||||
|
||||
Model::on = Model::bind
|
||||
Model::off = Model::unbind
|
||||
|
||||
|
||||
class Controller extends Module
|
||||
@include Events
|
||||
@include Log
|
||||
|
@ -516,7 +508,6 @@ class Controller extends Module
|
|||
|
||||
@el = document.createElement(@tag) unless @el
|
||||
@el = $(@el)
|
||||
@$el = @el
|
||||
|
||||
@el.addClass(@className) if @className
|
||||
@el.attr(@attributes) if @attributes
|
||||
|
@ -542,7 +533,7 @@ class Controller extends Module
|
|||
@unbind()
|
||||
@stopListening()
|
||||
|
||||
$: (selector) -> $(selector, @el)
|
||||
$: (selector) -> @el.find(selector)
|
||||
|
||||
delegateEvents: (events) ->
|
||||
for key, method of events
|
||||
|
@ -635,7 +626,7 @@ makeArray = (args) ->
|
|||
Spine = @Spine = {}
|
||||
module?.exports = Spine
|
||||
|
||||
Spine.version = '1.3.2'
|
||||
Spine.version = '1.4.1'
|
||||
Spine.isArray = isArray
|
||||
Spine.isBlank = isBlank
|
||||
Spine.$ = $
|
||||
|
|
Loading…
Reference in a new issue