2015-09-09 3 views
0

Это первый раз, когда я использовал наследование в coffeescript.Как вызвать методы из расширенного класса в coffeescript

Я пытаюсь вызвать метод из расширенного класса, но метод @create из window.StreamingStation дает мне this.create не является функцией

class window.BaseClass 
    constructor: (options) -> 
    @key = options['key'] 
    @content_id = null 
    @rtapi = options['rtapi'] 
    @switch = $('input[name="activate_autodj"]') 
    @setup() 

class window.StreamingStation extends window.BaseClass 
    constructor: (options) -> 
    super 

    list:() -> 
    $.ajax 
     url: @rtapi + '/api/StreamingStation/list' 
     type: 'get' 
     data: 
     query: 
      data: 
      contentId: @content_id 
      token: @key 
     success: (data) -> 
     console.log(data) 
    return 

    create:() -> 
    alert 'fsafsa' 
    return 

class window.AutoDj extends window.StreamingStation 

    constructor: (options) -> 
    super 

    setup: -> 
    @bindings() 
    @activateAutoDj() 

    bindings:() -> 
    $('input[type="checkbox"]').bootstrapSwitch({size: 'mini'}); 

    activateAutoDj:() -> 
    $('input[data-id]').on 'switchChange.bootstrapSwitch', (event, state) -> 
     @create() 
     state = (state == true ? 1 : 0) 
     @content_id = $(this).attr('data-id') 
     $.ajax 
     url: "/autodjs/#{@content_id}/activate_autodj" 
     type: 'post' 
     data: {state: state} 
     async: true 
     success: (data) -> 
      if (data.error == 0) 
      else 
      @raiseSystemAlert(data.message) 
     error: (data) -> 
      @raiseSystemAlert('Unexpected error, Please try again.') 

    raiseSystemAlert: (message) -> 
    modal = $('#systemAlertModal') 
    modal.find('.modal-body').html(message) 
    modal.modal('show') 

Спасибо, ребята заранее

+0

было некоторое время, так как я сделал CoffeeScript, но на первый взгляд кажется, что вы не связываясь с 'this' контекста в' ... 'switchChange .bootstrapSwitch '... 'обработчик событий. Попытайтесь использовать жирную стрелу/хеш-ракету ('=>') для этой функции. Дай мне знать, если это работает. –

+0

@ это so @create() равно этому. Создайте() –

+0

Правильно. Но обработчик события называется «асинхронно», а его «этот» контекст не будет «этим» экземпляра «AutoDj». –

ответ

0

Этот вопрос по-видимому, в функции обработчика событий вы объявлены внутри activateAutoDj метода:

$('input[data-id]').on 'switchChange.bootstrapSwitch', (event, state) -> 

Поскольку вы используете тонкий/Stabby стрелка, то this контекст обработчика события не будет this контекстом примера AutoDj; на самом деле это будет то, что решает собеседник, что в этом случае будет объектом, инициировавшим это событие, если я не ошибаюсь.

Один из способов решения этой проблемы - заставить функцию обработчика события связываться с контекстом this, используя вместо этого жир/лишайник (=>).

Или другим способом, как вы указали, является использование замыкания для сохранения контекста родительской функции this. Как вы указали, вы бы просто сделать что-то вроде:

cls = @ # preserving the `this` context 
$('input[data-id]').on 'switchChange.bootstrapSwitch', (event, state) -> 
    cls.create() 
    # rest of function 
Смежные вопросы