Better preserving supermodel when navigating between new hero levels. Fixed a problem with garbage collection of large CocoModel error callbacks.

This commit is contained in:
Nick Winter 2014-09-25 00:02:53 -07:00
parent cce36333dd
commit c0c436189f
4 changed files with 30 additions and 6 deletions

View file

@ -121,6 +121,7 @@ class CocoModel extends Backbone.Model
@markToRevert() if @_revertAttributes
@clearBackup()
CocoModel.pollAchievements()
options.success = options.error = null # So the callbacks can be garbage-collected.
options.error = (model, res) =>
error(@, res) if error
return unless @notyErrors
@ -131,6 +132,7 @@ class CocoModel extends Backbone.Model
noty text: "#{errorMessage}: #{res.status} #{res.statusText}", layout: 'topCenter', type: 'error', killer: false, timeout: 10000
catch notyError
console.warn "Couldn't even show noty error for", error, "because", notyError
options.success = options.error = null # So the callbacks can be garbage-collected.
@trigger 'save', @
return super attrs, options

View file

@ -26,6 +26,8 @@ module.exports = class ControlBarView extends CocoView
'click': -> Backbone.Mediator.publish 'tome:focus-editor', {}
'click .home a': 'onClickHome'
constructor: (options) ->
@worldName = options.worldName
@session = options.session
@ -51,12 +53,18 @@ module.exports = class ControlBarView extends CocoView
c.multiplayerEnabled = @session.get('multiplayer')
c.ladderGame = @level.get('type') is 'ladder'
c.spectateGame = @spectateGame
@homeViewArgs = [{supermodel: @supermodel}]
if @level.get('type', true) in ['ladder', 'ladder-tutorial']
c.homeLink = '/play/ladder/' + @level.get('slug').replace /\-tutorial$/, ''
levelID = @level.get('slug').replace /\-tutorial$/, ''
@homeLink = c.homeLink = '/play/ladder/' + levelID
@homeViewClass = require 'views/play/ladder/LadderView'
@homeViewArgs.push levelID
else if @level.get('type', true) is 'hero'
c.homeLink = '/play-hero'
@homeLink = c.homeLink = '/play-hero'
@homeViewClass = require 'views/play/WorldMapView'
else
c.homeLink = '/'
@homeLink = c.homeLink = '/'
@homeViewClass = require 'views/HomeView'
c.editorLink = "/editor/level/#{@level.get('slug')}"
c.multiplayerSession = @multiplayerSession if @multiplayerSession
c.multiplayerPlayers = @multiplayerPlayers if @multiplayerPlayers
@ -84,6 +92,11 @@ module.exports = class ControlBarView extends CocoView
showGameMenuModal: ->
@openModalView new GameMenuModal level: @level, session: @session
onClickHome: (e) ->
e.preventDefault()
e.stopImmediatePropagation()
Backbone.Mediator.publish 'router:navigate', route: @homeLink, viewClass: @homeViewClass, viewArgs: @homeViewArgs
onJoinedRealTimeMultiplayerGame: (e) ->
@multiplayerSession = e.session
@multiplayerPlayers = new RealTimeCollection('multiplayer_level_sessions/' + @multiplayerSession.id + '/players')

View file

@ -14,6 +14,7 @@ module.exports = class VictoryModal extends ModalView
events:
'click .next-level-button': 'onPlayNextLevel'
'click .world-map-button': 'onClickWorldMap'
# review events
'mouseover .rating i': (e) -> @showStars(@starNum($(e.target)))
@ -64,6 +65,11 @@ module.exports = class VictoryModal extends ModalView
@saveReview() if @$el.find('.review textarea').val()
Backbone.Mediator.publish 'level:play-next-level', {}
onClickWorldMap: (e) ->
e.preventDefault()
e.stopImmediatePropagation()
Backbone.Mediator.publish 'router:navigate', route: '/play-hero', viewClass: require('views/play/WorldMapView'), viewArgs: [{supermodel: @supermodel}]
onGameSubmitted: (e) ->
ladderURL = "/play/ladder/#{@level.get('slug')}#my-matches"
Backbone.Mediator.publish 'router:navigate', route: ladderURL

View file

@ -3,6 +3,7 @@ template = require 'templates/play/modal/play-level-modal'
ChooseHeroView = require 'views/game-menu/ChooseHeroView'
InventoryView = require 'views/game-menu/InventoryView'
PlayLevelView = require 'views/play/level/PlayLevelView'
LadderView = require 'views/play/ladder/LadderView'
LevelSession = require 'models/LevelSession'
module.exports = class PlayLevelModal extends ModalView
@ -97,10 +98,12 @@ module.exports = class PlayLevelModal extends ModalView
@showLoading()
@updateConfig =>
@navigatingToPlay = true
viewClass = if @options.levelPath is 'ladder' then LadderView else PlayLevelView
Backbone.Mediator.publish 'router:navigate', {
route: "/play/#{@options.levelPath || 'level'}/#{@options.levelID}",
viewClass: PlayLevelView,
viewArgs: [{supermodel: @supermodel}, @options.levelID]}
route: "/play/#{@options.levelPath || 'level'}/#{@options.levelID}"
viewClass: viewClass
viewArgs: [{supermodel: @supermodel}, @options.levelID]
}
onEnterPressed: (e) ->
(if @chooseHeroView.$el.hasClass('secret') then @onClickPlayLevel else @onClickChooseInventory).apply @