Цикл Backbone.js setTimeout () в CoffeeScript - PullRequest
4 голосов
/ 18 августа 2011

Кажется, что каждый раз, когда я пытаюсь это сделать, это выдает какую-то ошибку.Вот как теперь выглядит мой код:

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);

Я вызываю функцию в своих событиях.У меня inc = 1 и pre = 0 определены вне Backbone.View .. Моя текущая ошибка «Uncaught TypeError: Object [object DOMWindow] не имеет метода runShow»
БОНУСНЫЕ ТОЧКИ: как я могу ссылаться на t из другогофункция (чтобы запустить мой clearTimeout (t))?

1 Ответ

8 голосов
/ 18 августа 2011

Вы просите функцию setTimeout оценить "this.runShow()", и setTimeout сделает это в контексте window.Это означает, что this является объектом window при оценке этого кода.

Чтобы избежать этого, вы можете создать функцию и связать ее с текущим контекстом, чтобы каждый раз вызывать функцию, this - это то же самое, что и при создании функции.

В сценарии кофе вы можете сделать это с помощью =>:

func = =>
    this.runShow()

setTimeout(func, 2000)

Или наодна строка:

setTimeout((=> this.runShow()), 2000)

как я могу ссылаться на t из другой функции?

Сделать t свойством вашего объекта:

class Something
    t: null
    runShow: ->
       ...
       this.t = ...
    otherFunction: ->
       t = this.t
...