将父类的引用传递给子级

时间:2013-02-24 12:57:48

标签: class coffeescript

我试图将对父类实例的引用传递给它的子类。父类是:

class UI

  constructor: (parameters) ->

    @addBTS = new AddBTS
    @toolbar = new Toolbar(this)

AddBts和Toolbar类是:

class Toolbar
  constructor: (@parent) ->

  add_bts_clickhandler: () =>
    $('body').on 'click', '#add_bts', ->
      @parent.addBTS.display()


class AddBTS
  constructor: () ->


  display: () =>
    $("#setBuildingTileSet").show()
    console.log 'Showing Sir'

所有这些类都在单独的CoffeeScript文件中定义,并在按照以下顺序进行缩进之前连接在一起(游戏是UI实例所在的位置):

  'src/Game'
  'src/UI/UI'
  'src/UI/AddBTS'
  'src/UI/Toolbar'

不,当我致电add_bts_clickhandler: ()时,我收到错误消息:*无法读取属性' addBTS'未定义的*

所以它认为父母是未定义的,当它显然不是。

请有人帮助我,我完全卡住了,因为我的代码接缝很好。

1 个答案:

答案 0 :(得分:2)

我的解决方案:

我打电话给add_bts_clickhandler:

ui = new window.UI();
ui.toolbar.add_bts_clickhandler();

我的课程:

class window.UI
  constructor: (parameters) ->
    @addBTS = new window.AddBTS
    @toolbar = new window.Toolbar(this)


class window.AddBTS
  constructor: () ->

  display: () =>
    $("#setBuildingTileSet").show()
    console.log 'Showing Sir'


class window.Toolbar
  constructor: (@parent) ->

  add_bts_clickhandler: () =>
    p = @parent  ## introduce a new variable!
    $('body').on 'click', '#add_bts', ->
      p.addBTS.display(); ##
      #@parent.addBTS.display() 

让我们更接近工具栏类:

class window.Toolbar
    constructor: (@parent) ->

    add_bts_clickhandler: () =>
        $('body').on 'click', '#add_bts', ->
            @parent.addBTS.display() 

生成的javascript的一部分:

Toolbar.prototype.add_bts_clickhandler = function() {
    return $('body').on('click', '#add_bts', function() {
        return this.parent.addBTS.display();
    });
};

在此行中:返回 .parent.addBTS.display();
这个指的是回调函数()!不是add_bts_clickhandler。

我希望我帮助过你。