使用 CoffeeScript 的类和 jquery.transit 创建一个回调循环
Create a callback loop with CoffeeScript's classes and jquery.transit
使用 jquery.transit
我想使用 jquery.transit 的回调参数构建一个循环。我不想使用setTimeout()
来避免可能的竞争条件。
以下代码有效:http://jsfiddle.net/2errn/
$ ->
animate = () ->
console.log "animate()"
$(".rect").transition({x: 10}, animate)
animate()
矩形只移动一次,但在控制台中很明显,该方法被多次输入。所以这行得通!为了使它更频繁地移动,我需要在 x 坐标中添加一个增量计数器,但这不是这里的问题。
我想将功能封装在一个类中,但在这里它失败了:http://jsfiddle.net/6A97m/1/
$ ->
class Animator
animate: ->
console.log "animate()"
$(".rect").transition({x: 10}, @animate)
new Animator().animate()
在日志记录语句的输出停止之前,仅输入该函数两次。为什么?我该如何解决这个问题?
这只是一个未绑定的函数引用:
@animate
该引用没有绑定到它的特定@
,因此在调用它时将选择@
。特别是,@
不会是您Animator
实例,因此@animate
第二次访问它时会undefined
。
如果您将console.log
更改为以下内容:
console.log @, "animate()"
您会看到第一次调用@
animate
实例时是您的Animator
实例,但第二次调用时它是其他实例。
有多种解决方案:
使用绑定方法:
animate: => console.log "animate()" $(".rect").transition({x: 10}, @animate)
演示:http://jsfiddle.net/ambiguous/3puUe/
使用
bind
传递时绑定animate
:animate: -> console.log "animate()" $(".rect").transition({x: 10}, @animate.bind(@))
演示:http://jsfiddle.net/ambiguous/BPSa9/
使用旧的
_this = this
技巧手动设置适当的@
:animate: -> console.log "animate()" _this = @ $(".rect").transition({x: 10}, -> _this.animate())
演示:http://jsfiddle.net/ambiguous/p4z8x/
大多数工具包库都有自己的绑定方法,以防您无法保证Function.bind
可用:_.bind
、$.proxy
、...
相关文章:
- 创建一个循环来简化HTML和CSS代码
- 如何使用“;getElementById”;在一个循环中
- jQuery触发器事件在一个循环中多次出现
- js:如何制作一个循环,将20个不同的东西添加到一个对象中
- 每第n个图像具有下一个循环的余数偏移
- CasperJS-如何治疗'单击'在一个循环中
- 我怎样才能把它变成一个循环,而不是一个递归函数
- 在一个循环中读取xml文件的所有节点
- ajax 返回带有循环的图像长度,检查最后一个循环
- JQuery Slider动画只发生一个循环
- JQuery 滑动一个表格形成,另一个循环滑动
- 如何跟踪有序列表中的顺序,该列表具有一个循环列表项,提供不同的参数
- Node.js:如何在一个循环中使用回调调用方法
- 我将如何批量添加大量 jquery 脚本,在一个循环中只有一个细微的差异
- 循环遍历 Angular HTTP 请求中的对象,等到响应后再运行下一个循环
- 从嵌套循环 Javascript 中的一个循环访问参数
- jQuery点击函数在for循环中只在最后一个循环中工作
- 我可以为 4 个不同的下拉列表创建一个循环吗?
- 翡翠模板在一个循环中有多个数组
- 仅使用一个循环生成嵌套数组