我是coffeescript的新手并且对访问功能有疑问。
鉴于以下代码,如何从构造函数的for循环中访问checkType函数?
class ApplicationForm.Save
constructor: (@formItems) ->
@that = this
for item in @formItems
do ->
checkType(item)
checkType: (forItem) ->
console.log(@formItem.find("input").length)
答案 0 :(得分:1)
这里似乎有一点混乱:
@that = this
没有任何意义。您似乎正在尝试重现以下常见的JavaScript惯用语:
var that = this;
这样您就可以在其他地方使用所需的this
。但@
并非用于声明变量(CoffeeScript会自动执行此操作),@
只是this.
的简写。您说this.that = this
并没有任何用处。
do
用在循环中。常见的情况是这样的:
for i in [0, 1, 2]
$(".something#{i}").click -> console.log(i)
由于所有匿名回调都使用相同的2
引用,因此该代码只会导致所有内容i
,无论点击的内容如何。添加do
只是将循环体包装在一个自调用函数中,以强制取消引用循环变量,这样:
for i in [0, 1, 2]
do (i) ->
# do something with `i`...
就像这个JavaScript:
for(i = 0; i <= 2; ++i)
(function(i) {
// do something with `i`...
})(i)
您已将item
传递给某个功能,因此do
是多余的。
您的checkType(item)
正试图调用一个不存在的函数。您似乎想要调用checkType
方法并回到@
的全部内容,我们发现您需要使用@
在this
上调用该方法:
@checkType(item)
您的checkType
方法有一个forItem
参数,但您在方法中使用@formItem
。但同样,@
就是我们在CoffeeScript中说this
的方式,因此似乎有一个拼写错误(forItem
与formItem
)的组合以及对{@
的一些混淆1}}意思是您的checkType
可能应该是这样的:
checkType: (formItem) ->
console.log(formItem.find("input").length)
把所有这些放在一起给了我们:
class ApplicationForm.Save
constructor: (@formItems) ->
for item in @formItems
@checkType(item)
checkType: (formItem) ->
console.log(formItem.find("input").length)
答案 1 :(得分:0)
您需要在for循环中使用胖箭头=>
,以便从构造函数中保留this
的值:
for item in @formItems
do =>
@checkType(item)
您可以在CoffeeScript documentation中了解有关胖箭头语法的更多信息。