我有一个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;
})();
答案 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很精彩。