如何在维护DRY代码的同时运行依赖于js事件的coffeescript方法

How can I run a coffeescript method that depends on the js event while maintaining DRY code?

本文关键字:依赖于 运行 js 事件 方法 coffeescript 维护 DRY 代码      更新时间:2023-09-26

我想清空这个代码:

@$canvas.on 'mousemove', (e) =>
  return unless @running
  @mouseTarget.set @board.x + e.clientX, @board.y + e.clientY * 2
  @player?.mouseMove()
@$canvas.on 'mousedown', (e) =>
  return unless @running
  @mouseTarget.set @board.x + e.clientX, @board.y + e.clientY * 2
  @player?.mouseDown()
@$canvas.on 'mouseup', (e) =>
  return unless @running
  @mouseTarget.set @board.x + e.clientX, @board.y + e.clientY * 2
  @player?.mouseUp()

我想有一些效果:

@$canvas.on 'mousemove', 'mousedown', 'mouseup' -> @mouseAction
mouseAction: (e) =>
  return unless @running
  @mouseTarget.set @board.x + e.clientX, @board.y + e.clientY * 2
  @player?.mouseUp() # here is the problem...

问题是,在维护DRY代码的同时,如何在@player?.mouseUp()@player?.mouseDown()@player?.mouseMove()之间交替?

要扩展pdoherty926的答案,您希望以某种方式做同样的事情,但在@player上调用不同的方法。如果您控制方法名称并且始终可以使用事件类型,那么您可以按照pdoherty926的建议进行操作——否则,这里有一个更明确的解决方案建议:

@$canvas.on 'mousemove', @mouseAction 'mouseMove'
@$canvas.on 'mousedown', @mouseAction 'mouseDown'
@$canvas.on 'mouseup', @mouseAction 'mouseUp'
mouseAction: (action) =>
  (e) =>
   return unless @running
   @mouseTarget.set @board.x + e.clientX, @board.y + e.clientY * 2
   @player?[action]()

您可以尝试:

capitaliseFirstLetter = (string) -> string.charAt(0).toUpperCase() + string.slice(1)
# you could also include the underscore.string library and use _.capitalize
event_type = "mouse#{capitaliseFirstLetter(e.type.split('mouse')[1])}"
@player[event_type]()