在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
函数的静态属性