Coffeescript Object方法不是一个函数

时间:2013-02-19 06:57:59

标签: jquery ruby-on-rails coffeescript

我有一个CoffeeScript对象,在触发操作后给我一个奇怪的错误。

对象加载时没有发生意外,尽管一旦完成触发回调的操作,我收到错误:

this.update不是函数 返回this.update(value);

有谁知道为什么会出现这个错误?我最好的猜测是jQuery.rating调用中的 this 对象实际上是指一个jQuery对象,而不是评级对象?

我的CoffeeScript代码是:

jQuery ->
    new Rating()

class Rating
    constructor: ->
        $('.auto-submit-star').rating
            callback: 
                (value, link) -> @update value

    update: (value) =>
        $.ajax
            type: 'post'
            url: $('#new_rating').attr('action')
            data: 'rating': value
        .done ( msg ) -> 
            alert( msg )

代码编译为:

var Rating,
  __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };

Rating = (function() {

  function Rating() {
    this.update = __bind(this.update, this);
    $('.auto-submit-star').rating({
      callback: function(value, link) {
        return this.update(value);
      }
    });
  }

  Rating.prototype.update = function(value) {
    return $.ajax({
      type: 'post',
      url: $('#new_rating').attr('action'),
      data: {
        'rating': value
      }
    }).done(function(msg) {
      return alert(msg);
    });
  };

  return Rating;

})();

2 个答案:

答案 0 :(得分:3)

您的rating插件可能将callback称为简单函数或在DOM元素的上下文中,因此@(AKA this)可能是{{1 }或您的window元素。在任何情况下,.auto-submit-star都不是您的@对象,并且没有Rating方法,因此您收到错误。

标准方法是通过fat-arrow (=>)

使用绑定函数
update

答案 1 :(得分:0)

我遇到了类似的错误:'fn.apply不是函数',结果是我有一个与方法同名的构造函数参数。

do->
  angular.module 'myservices'
  .service 'averyspecialservice', ['$log', '$rootScope'
    class AVerySpecialService
      constructor: (@log, @rootScope)->

      log: (message)=>
        //do some magic here
        return
  ]
  return

所以'log'被定义为一个方法和注入的值,并且用这样一个模糊的错误消息找到错误的原因被证明是有趣的...不是JavaScript很精彩。