coffeescript类 - 调用另一个类的方法

时间:2016-06-11 08:05:57

标签: javascript jquery ruby-on-rails coffeescript turbolinks

我已经在我的rails应用程序中将我的嵌入式JS重写为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,但这是指触发事件的按钮元素。

那我该怎么做? 其他方法是受欢迎的。我不确定我是否需要这些课程...但我真的想要结构化代码...

2 个答案:

答案 0 :(得分: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()
  ...

让我知道它是否有效。

答案 1 :(得分:0)

根据Kumar的回答,您可以使用胖箭头将@绑定到this

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

试试。