Класс coffeescript - вызов вызова одного метода класса из другого

Я переписал свой встроенный JS в своем приложении rails на coffeescript... и я новичок в coffeescript...

Мой подход представляет собой смесь этих статей:

Мой код:

s = undefined
class App.PhotoLike

  settings:
    modalElement: $('#myModal')
    likeButtonId: '#like'
    photo_id: $('.image_info').attr('photo_id')
    numberOfLikes: $('#likes_num')

  constructor: (@el) ->
    console.log('constructor called')
    s = @settings
    @bindUIActions()
    return this


  bindUIActions: ->
    console.log('bindUIActions called')
    $('#myModal').on 'click', '#like', -> likePhoto()
    $(document).on "page:change", -> pageChange()


  pageChange: ->
    console.log('pageChange called')
    photo = new App.Photo

  likePhoto: ->
    console.log('likePhoto called')
    url = '/photos/' + s.photo_id + '/like'
    $.get url, (data) ->
      s.numberOfLikes.html data['likes'] + ' likes'
      $(s.likeButtonId).toggleClass 'btn-success'

Это часть модели, которая загружается с помощью ajax, и после успешного выполнения этого вызова я создаю вышеуказанный класс (экземпляр):

new (App.PhotoLike)

Моя проблема. Модальный режим загружается, и все кажется хорошим. Но когда я запускаю событие:

$('#myModal').on 'click', '#like', -> likePhoto()

Я получил:

photo.like.self-942fcd8….js?body=1:25 Uncaught ReferenceError: likePhoto is not defined

поэтому он не знает функцию likePhoto. Я пробовал вызывать this.likePhoto и @likePhoto, но это относится к элементу кнопки, который запускает событие.

Итак, как мне это сделать? Другие подходы приветствуются. я не совсем уверен, что мне нужны классы... но я действительно хочу структурированный код...


person martin    schedule 11.06.2016    source источник


Ответы (2)


likePhoto() — это функция нашего объекта/класса App.PhotoLike. И вы вызываете это как локальную функцию.

Вместо этого вы можете сделать что-то подобное

bindUIActions: ->
  _this = this #this will change inside, so we have to have a reference to our object here
  console.log('bindUIActions called')
  $('#myModal').on 'click', '#like', -> _this.likePhoto()
  ...

Дайте мне знать, если это работает.

person Kumar    schedule 11.06.2016
comment
Yay .. это работает ... так просто! Можете ли вы помочь мне с дополнительным вопросом... как мне заставить переменную s (настройки) работать так, как задумано внутри класса? - person martin; 11.06.2016
comment
Извините, что вы имеете в виду, как задумано. Чего вы хотите достичь? - person Kumar; 11.06.2016
comment
У меня есть переменная настроек в верхней части класса, где я устанавливаю различные настройки, необходимые для класса. Поэтому я хочу использовать эти настройки в классе, например. Настройки.url - person martin; 11.06.2016
comment
Я думаю, вы можете напрямую использовать из настроек. url = '/photos/' + @settings.photo_id + '/like'. Это должно работать нормально, если только ваша область не изменится с текущего объекта на окно или что-то еще. В этом случае вы можете сделать ссылку _this = @ в верхней части вашей функции, чтобы использовать ее позже. Надеюсь, поможет. - person Kumar; 11.06.2016
comment
Вы также можете поместить свои настройки в функцию инициализации, чтобы убедиться, что они доступны при инициализации вашего объекта. - person Kumar; 11.06.2016

Основываясь на ответе Кумара, вы можете использовать толстые стрелки для привязки @ к this:

bindUIActions: =>
  console.log('bindUIActions called')
  $('#myModal').on 'click', '#like', -> @likePhoto()

Попробуй это.

person Cheezmeister    schedule 15.06.2016