在jQuery .each()中使用Coffeescript'this'

我有一些咖啡,如下所示:

class foo: @bar = 'bob loblaw' processRows: -> $("#my-table>tr").each -> id = $(this).attr("id") @processRow id processRow: (id) -> console.log @bar + id 

所以我的问题是:我需要this引用循环内的.each上下文来获得id ,但我也希望this引用foo.processRow()里面的类实例 – 它目前不做。

.each函数之外使用_this = this.each并传递它也不是一个好的解决scheme,因为我在processRow引用了许多类variables。

有什么想法吗? 我错过了什么明显的? 谢谢!

jQuery.each传递当前元素作为callback的第二个参数,所以你不必为jQuery保留this

 processRows: -> $("#my-table>tr").each (index, element) => id = $(element).attr("id") @processRow id 

注意callback函数使用胖箭头=> )语法 ; 它将函数的上下文绑定到当前的值。 ( this在callback函数中总是和你在定义函数的时候一样)。

你说

.each函数之外使用_this = this.each并传递它也不是一个好的解决scheme,因为我在processRow中引用了许多类variables。

不过,这是最有效的解决scheme。 JavaScript的this是一个奇怪的野兽; 你可以使用=>运算符把它固定在一个嵌套函数中,因为arnaud576875在他的答案(这是优雅而低效的)中获取,或者你可以把它复制到另一个variables(这是有效但不雅的)。 这是你的select。

请注意,一些现代浏览器支持每个函数的bind方法,这比CoffeeScript =>更有效。 有一个开放的票据=>使用本地bind时可用: https : //github.com/jashkenas/coffee-script/pull/1408

附录:当然,比上面任何一个更有效的替代方法都是写

 for element, index in $('#my-table>tr') ... 

这也将解决你的this问题。

你的代码…

 class foo @bar = 'bob loblaw' processRows: -> $("#my-table>tr").each -> id = $(this).attr("id") @processRow id processRow: (id) -> console.log @bar + id 

被转译成…

 var foo; foo = (function() { function foo() {} foo.bar = 'bob loblaw'; foo.prototype.processRows = function() { return $("#my-table>tr").each(function() { var id; id = $(this).attr("id"); return this.processRow(id); }); }; foo.prototype.processRow = function(id) { return console.log(this.bar + id); }; return foo; })(); 

对于目前正在翻译的内容,它已经假设了很多。 不幸的是,由于jQuerypipe理上下文,所以你必须明确或者声明一个对你的类的引用。

顺便说一下,生成的代码还有其他问题,请看这个简化的情况:

 class foo @bar = 'bob loblaw' getBar: () -> @bar 

运输到:

 var foo; foo = (function() { function foo() {} foo.bar = 'bob loblaw'; foo.prototype.getBar = function() { return this.bar; }; return foo; })(); 

试图使用这段代码的结果:

 > foo.bar; "bob loblaw" > var f = new foo(); undefined > f.getBar(); undefined 

你的代码似乎期望@bar是一个自己的属性,但它被创build为foo函数的静态属性