neft
Version:
Universal Platform
158 lines (116 loc) • 3.88 kB
text/coffeescript
'use strict'
utils = require 'src/utils'
assert = require 'src/assert'
log = require 'src/log'
assert = assert.scope 'View.Use'
log = log.scope 'View', 'Use'
module.exports = (File) -> class Use
= 'Use'
= 'File.Use'
JSON_CTOR_ID = = File.JSON_CTORS.push(Use) - 1
i = 1
JSON_NODE = i++
JSON_ARGS_LENGTH = = i
= (file, arr, obj) ->
unless obj
node = file.node.getChildByAccessPath arr[JSON_NODE]
obj = new Use file, node
obj
visibilityChangeListener = ->
if .isRendered and not
propsChangeListener = (name) ->
if name is 'component'
= .props['component']
if
return
queue = []
queuePending = false
runQueue = ->
style = queue.shift()
file = queue.shift()
if style.isRendered
style.renderComponent file
if queue.length
requestAnimationFrame runQueue
else
queuePending = false
return
constructor: (, ) ->
assert.instanceOf , File
assert.instanceOf , File.Element
= .props.component
= .props.ref
= null
= false
.onVisibleChange visibilityChangeListener, @
.onPropsChange propsChangeListener, @
`//<development>`
if is Use
Object.preventExtensions @
`//</development>`
render: (file) ->
assert.instanceOf file, File if file?
return unless .visible
if
= true
useAsync = utils.isClient
useAsync &&= .props.has 'n-async'
useAsync &&= .props['n-async'] isnt false
if useAsync
queue.push @, file
unless queuePending
requestAnimationFrame runQueue
queuePending = true
else
file
return
renderComponent: (file) ->
component = .components[]
if not file and not component and not File._files[]
return
usedComponent = file or File.factory(component or )
if file
file.parentUse?.detachUsedComponent()
unless usedComponent.isClone
usedComponent = usedComponent.clone()
unless usedComponent.isRendered
usedComponent = usedComponent.render null, .context, @
usedComponent.node.parent =
= usedComponent
# signal
usedComponent.parentUse = @
usedComponent.onReplaceByUse.emit @
File.emitNodeSignal usedComponent, 'n-onReplaceByUse', @
# ref
if
.inputRefs.set , usedComponent.scope
return
revert: ->
return unless
# ref
if
.inputRefs.set , .refs[]
# destroy used component
if
.revert().destroy()
= false
return
detachUsedComponent: ->
assert.isDefined
.node.parent = null
.parentUse = null
= null
return
clone: (original, file) ->
node = original.node.getCopiedElement , file.node
new Use file, node
toJSON: (key, arr) ->
unless arr
arr = new Array JSON_ARGS_LENGTH
arr[0] = JSON_CTOR_ID
arr[JSON_NODE] = .getAccessPath .node
arr