admin管理员组文章数量:1429926
Seems like every way I try this, it throws some sort of error. Here's what my code looks like now:
runShow: ->
moments = @model.get('moment_stack_items')
if inc == moments.length
inc = 1
pre = 0
$("#" + moments[pre].uid).hide("slide", { direction: "left" }, 1000)
$("#" + moments[inc].uid).show("slide", { direction: "right" }, 1000)
inc += 1
pre += 1
console.log "looping" + inc
t = setTimeout(this.runShow(),2000);
I call the function in my events.
I have inc = 1
and pre = 0
defined outside the Backbone.View.. My current error is "Uncaught TypeError: Object [object DOMWindow] has no method 'runShow'"
BONUS POINTS: how can I reference t from another function (to run my clearTimeout(t))?
Seems like every way I try this, it throws some sort of error. Here's what my code looks like now:
runShow: ->
moments = @model.get('moment_stack_items')
if inc == moments.length
inc = 1
pre = 0
$("#" + moments[pre].uid).hide("slide", { direction: "left" }, 1000)
$("#" + moments[inc].uid).show("slide", { direction: "right" }, 1000)
inc += 1
pre += 1
console.log "looping" + inc
t = setTimeout(this.runShow(),2000);
I call the function in my events.
I have inc = 1
and pre = 0
defined outside the Backbone.View.. My current error is "Uncaught TypeError: Object [object DOMWindow] has no method 'runShow'"
BONUS POINTS: how can I reference t from another function (to run my clearTimeout(t))?
- Using strings in your setTimeout is calling eval behind the scenes. I would strongly consider changing this to a reference of the function. e.g. t = setTimeout(this.runShow ,2000); stackoverflow./questions/86513/… – Gazler Commented Aug 18, 2011 at 16:43
- fair enough @Gazler, I've removed it from the code. The solution by user576875 also has it removed. – pizza247 Commented Aug 18, 2011 at 16:59
1 Answer
Reset to default 8You ask the setTimeout function to evaluate "this.runShow()"
, and setTimeout will do that in the context of window
. This means that this
is the window
object when this code is evaluated.
To avoid this you can create a function and bind it to a the current context, so that everytime the function is called, this
is the same as when the function has been created.
In coffee script you can do this with the =>
:
func = =>
this.runShow()
setTimeout(func, 2000)
Or on a single line:
setTimeout((=> this.runShow()), 2000)
how can I reference t from another function?
Make t
a property of your object:
class Something
t: null
runShow: ->
...
this.t = ...
otherFunction: ->
t = this.t
本文标签: javascriptBackbonejs setTimeout() loop in CoffeeScriptStack Overflow
版权声明:本文标题:javascript - Backbone.js setTimeout() loop in CoffeeScript - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1745529706a2662002.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论