$ timeout无法找到我的变量

时间:2015-12-03 15:12:25

标签: angularjs coffeescript

好的,使用Angular和Coffeescript,以下作品:

angular.module 'someApp'
  .factory 'someFactory', ($timeout) -> new class SomeClass
    constructor: ->
      @humans = 1

    findHuman: ->
      $timeout((=>@humans+=1), 1000)

我觉得这很好,但我想在其他地方拥有@ humans + = 1部分。

那为什么这不起作用?

angular.module 'someApp'
  .factory 'someFactory', ($timeout) -> new class SomeClass
    constructor: ->
      @humans = 1

    findHuman: ->
      $timeout(addOneHuman, 1000)

    addOneHuman = =>
      @humans+=1

使用console.log或$ log进行测试,在这里和那里添加@,>而不是=>有时变量人类是NaN,有时它是未定义的。

我需要做些什么来完成这项工作? :)

1 个答案:

答案 0 :(得分:0)

我不太了解Angular方面的情况,但我认为你的问题是:

addOneHuman = =>

没有做你认为的事情。像这样:

class C
  f = ->
  m: ->

f中创建C本质上是私有函数。 JavaScript版本等同于:

var C = (function() {
  function C() {}
  var f = function() {};
  C.prototype.m = function() {};
  return C;
})();

所以f只是一个引用函数的变量,而fC中任何内容的范围。将其更改为:

f = =>

没有做任何事情,因为在定义this时没有适用f。另一方面,m是一种方法(请注意JavaScript版本中的C.prototype.m),因此适用的thism: =>可以做一些有用的事情。

您只希望addOneHuman成为方法而不是普通的旧功能:

addOneHuman: =>
# ---------^

在我的其他几个答案中,你可能会有一些有用的东西: