尝试在Fancybox回调中调用CoffeeScript方法时的范围问题

时间:2016-01-08 13:10:55

标签: javascript jquery callback coffeescript scoping

我有以下名为Course的CoffeeScript模块。我有一小段代码,我想重复使用,我创建了一个名为preSelectItemSize的方法。

我想在调用init时以及afterShow Fancybox回调中调用此方法。以下代码可以使用,但它不相信使用模块名称是正确的,我应该使用@引用“this”。

我做错了什么? (为简洁起见,代码片段减少了)

$ = window.jQuery = require("jquery")
Course =

  init: ->

    $('.js-product-overlay').on 'click', (e) =>
      @viewProductClickHandler(e, MediaDetection)

    @preSelectItemSize()

  viewProductClickHandler: (e, mediaDetection) =>

    $('.js-product-overlay').fancybox({
      href: wishlist_overlay_href
      maxWidth: '775px'
      minHeight: '495px'
      autoCenter: '!isTouch'
      height: 'auto'
      scrolling: true
      fitToView: false
      autoSize: false
      padding: 0
      tpl:
        closeBtn: '<a class="fancybox-item modal__close fancybox-close" href="javascript:;">Close</a>'
      afterShow: ->
        $('.js-fancybox-close').on 'click', (e) ->
          e.preventDefault()
          $.fancybox.close()

        Course.preSelectItemSize()
    })

  preSelectItemSize: ->
    itemId = $('.modal__product-info').attr('data-item-id')
    $('#size-' + itemId).click()

module.exports = Course

2 个答案:

答案 0 :(得分:1)

我认为你真正的问题是你使用的是一个简单的对象文字,而不是一个类,所以=>的行为方式并不像你期望的那样,而你只是指Course按名称。

如果我们看一个简化的例子:

o =
  m: =>

我们可以通过查看生成的JavaScript来了解正在发生的事情:

var o;
o = {
  m: (function(_this) {
    return function() {};
  })(this)
};

因为我们只有一个简单的数据结构(即普通的旧对象文字),所以没有构造函数可以将m绑定到任何实例,它的行为就像你说的那样:

m = =>
o = m: m

所以o(或你的Course)的任何函数属性都只是普通的旧属性,恰好是函数,它们不是真正的方法。

你可以删除所有胖箭并按名称引用Course,或者你可以切换到一个类,以便有一个CoffeeScript实例将事物绑定到:

class Course
  #...
module.exports = new Course

答案 1 :(得分:0)

以下工作原理是将#include <stdint.h> #include <stdio.h> union { uint64_t i64; uint32_t i32[2]; uint16_t i16[4]; // these lines aren't needed for this code, just here uint8_t i8[8]; // as an example of what else might be useful } theUnion; theUnion.i64 = myInt64Value; printf("First u32 is %u, second u32 is %u\n", theUnion.i32[0], theUnion.i32[1]); 更改为细箭头并将viewProductClickHandler回调更改为胖箭头:

afterShow

请参阅小提琴,例如工作代码:https://jsfiddle.net/L5u31Lzr/1/