2016-06-11 7 views
1

Я переписан мой встроенный JS в моих рельсах приложении к coffeescript..and Я новичок в 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' 

Это часть модели, которая получает loded с 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, но это относится к элементу кнопки, который запускает событие.

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

ответ

1

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() 
    ... 

Позвольте мне знать, если он работает.

+0

Yay..it работает ... так просто! Можете ли вы помочь мне по следующему вопросу ... как мне получить переменную s (settings) для работы в классе – martin

+0

Простите, что вы имеете в виду, как предполагалось. Чего вы хотите достичь? – Kumar

+0

У меня есть переменная параметров в верхней части класса, где я устанавливаю различные параметры, необходимые для класса. Поэтому я хочу использовать эти настройки в классе, например. Settings.url – martin

0

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

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

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

Смежные вопросы