@danielkalen/simplybind
Version:
Magically simple, framework-less one-way/two-way data binding for frontend/backend in ~5kb.
215 lines (111 loc) • 5.35 kB
text/coffeescript
BindingInterface:: = Object.create BindingInterfacePrivate,
of: get: ()-> METHOD_of if not #=== if stage is 0
set: get: ()-> METHOD_set if #=== if stage is 1 or 2
chainTo: get: ()-> METHOD_chainTo if is 2
transformSelf: get: ()-> METHOD_transformSelf if is 1
transform: get: ()-> METHOD_transform if is 2
transformAll: get: ()-> METHOD_transformAll if is 2
condition: get: ()-> METHOD_condition if is 2
conditionAll: get: ()-> METHOD_conditionAll if is 2
bothWays: get: ()-> METHOD_bothWays if is 2
unBind: get: ()-> METHOD_unBind if is 2
pollEvery: get: ()-> METHOD_pollEvery if #=== if stage is 1 or 2
stopPolling: get: ()-> METHOD_stopPolling if #=== if stage is 1 or 2
setOption: get: ()-> METHOD_setOption if is 2
disallowFrom: get: ()-> if is 2 and (thisInterface=@)
genProxiedInterface false, (disallowInterface)->
subInterface = thisInterface.subs[thisInterface.subs.length-1]
thisInterface._.addDisallowRule(subInterface._, disallowInterface._)
return thisInterface
updateOn: get: ()-> if and (thisInterface=@) #=== if stage is 1 or 2
genProxiedInterface false, (subInterface)->
if subInterface._ isnt thisInterface._
thisInterface._.pubsMap[subInterface._.ID] = subInterface._
subInterface._.addSub genSelfUpdater(thisInterface._, true), subInterface.options, false, true
return thisInterface
removeUpdater: get: ()-> if and (thisInterface=@) and (selfUpdater=.selfUpdater) #=== if stage is 1 or 2
genProxiedInterface false, (subInterface)->
if subInterface._.subsMeta[selfUpdater.ID]
delete thisInterface._.pubsMap[subInterface._.ID]
subInterface._.removeSub(selfUpdater)
return
to: get: ()-> if is 1 and (thisInterface=@)
genProxiedInterface true, (subInterface)->
if subInterface._ isnt thisInterface._
subInterface.addToPublisher(thisInterface)
return thisInterface
and: get: ()->
cloneInterface =
if is 2
return cloneInterface
else if is 1
if not cloneInterface._.isMulti
cloneBinding = cloneInterface._
cloneInterface._ = cloneInterface._ = new GroupBinding(cloneInterface)
cloneInterface._.addBinding(cloneBinding)
return genProxiedInterface false, (siblingInterface)->
cloneInterface._.addBinding(siblingInterface._)
return cloneInterface
once: get: ()-> if is 1
interfaceToReturn =
interfaceToReturn.updateOnce = true
return interfaceToReturn
# ==== Aliases =================================================================================
update: get: ()->
twoWay: get: ()->
pipe: get: ()->
METHOD_of = (object)->
throwErrorBadArg(object) unless checkIf.isObject(object) or checkIf.isFunction(object)
if checkIf.isBindingInterface(object)
object = object.object
= 1
return
METHOD_chainTo = (subject, specificOptions, saveOptions)->
return SimplyBind([.length-1]).to(subject, specificOptions, saveOptions)
METHOD_set = (newValue)->
.setValue(newValue)
return @
METHOD_transformSelf = (transformFn)-> # Applied only to the last sub
if not checkIf.isFunction(transformFn)
throwWarning('fnOnly',1)
else
.setSelfTransform(transformFn, .updateOnBind)
return @
METHOD_transform = (transformFn)-> # Applied only to the last sub
.addModifierFn('transformFn', .slice(-1), transformFn, .updateOnBind)
return @
METHOD_transformAll = (transformFn)-> # Applied to entrie subs set
.addModifierFn('transformFn', , transformFn, .updateOnBind)
return @
METHOD_condition = (conditionFn)-> # Applied only to the last sub
.addModifierFn('conditionFn', .slice(-1), conditionFn)
return @
METHOD_conditionAll = (conditionFn)-> # Applied to entrie subs set
.addModifierFn('conditionFn', , conditionFn)
return @
METHOD_bothWays = (altTransform)-> # Applied only to the last sub
sub = [.length-1] # Last Proxied
subBinding = sub._
bindings = if .isMulti then .bindings else []
subBinding.addSub(, sub.options)
for binding in bindings
originTransform = binding.subsMeta[subBinding.ID].transformFn
originCondition = binding.subsMeta[subBinding.ID].conditionFn
if originTransform or altTransform
transformToUse = if checkIf.isFunction(altTransform) then altTransform else originTransform
subBinding.subsMeta[.ID].transformFn = transformToUse if transformToUse and altTransform isnt false
if originCondition
subBinding.subsMeta[.ID].conditionFn = originCondition
return @
METHOD_unBind = (bothWays)-> # Applied to all subs
.removeSub(sub._, bothWays) for sub in
return @
METHOD_pollEvery = (time)->
.addPollInterval(time)
return @
METHOD_stopPolling = ()->
.removePollInterval()
return @
METHOD_setOption = (optionName, newValue)->
.subsMeta[[.length-1]._.ID].opts[optionName] = newValue
return @