Views.coffeesrc/ | |
---|---|
define ['./View'], (View) ->
CollectionView: new Class
Extends: View
Binds: ['_sortViews', '_collectionAdd']
options: | |
Define a view for when collection is empty | itemEmptyView: null
itemViewOptions: {}
initialize: (@collection, @listEl, @modelView, options={}) ->
@setOptions options
@collection.addEvents
add: @_collectionAdd
sort: @_sortViews
remove: (model) =>
@_removeModelsView model
@_toggleEmptyViewIfEmpty()
@_createModelViews()
@_toggleEmptyViewIfEmpty()
@sort()
@
getModelsView: (model) ->
views = @getViews @listEl
for view in views
if view.model is model
return view
_removeModelsView: (model) ->
view = @getModelsView model
view.destroy() if view?
_toggleEmptyViewIfEmpty: ->
return unless @options.itemEmptyView
if @collection.length == 0
@_showEmptyItem()
else
@_hideEmptyItem()
sort: ->
@collection.sortBy @collection.sortField if @collection.sortField?
_createModelViews: ->
@_createModelView(model) for model in @collection
_createModelView: (model) ->
options = Object.clone @options.itemViewOptions
Object.append options,
autoDestroyModel: true
model: model
injectTo: @listEl
onAny: (event, args=[]) =>
if event in ['render', 'rerender']
@sort()
@fireEvent event, [view].combine(args)
view = new @modelView options
_collectionAdd: (model) ->
@_toggleEmptyViewIfEmpty()
@_createModelView model
@_sortViews()
_showEmptyItem: ->
return if @_emptyItem
@_emptyItem = new @options.itemEmptyView @options.itemViewOptions
@_emptyItem.inject @listEl
_hideEmptyItem: ->
return unless @_emptyItem
@_emptyItem.destroy()
delete @_emptyItem
_sortViews: ->
return unless @collection.length > 0
@reorderViews @collection, @listEl
destroy: ->
@collection.removeEvents
add: @_collectionAdd
sort: @_sortViews
@destroyViews @listEl
|