【问题标题】:Setting AngularJS controller property cannot be last line using Coffeescript使用 Coffeescript 设置 AngularJS 控制器属性不能是最后一行
【发布时间】:2015-05-27 23:07:34
【问题描述】:

我正在使用 Coffeescript 并试图定义一个控制器,它将 使用“HomeController as homeCtrl”语法。

angular.module('myApp.controllers',[]).controller("HomeController", ->

    @someArray = []

    # return
)

这已损坏 - scope.homeCtrl 设置为 [] 而不是对象 {someArray: []}。我意识到这是因为 Coffeescript 自动返回函数的最后一行,所以转译后的 return this.someArray = [] 返回函数的 []。我可以通过取消注释 return 命令,甚至像 return true@baz='foobar' 这样的命令来解决这个问题。但真正奇怪的是,只有当函数的最后一行返回一个数组时,这才会搞砸。怎么回事?

【问题讨论】:

    标签: javascript angularjs coffeescript


    【解决方案1】:

    那个问题让我快死了!它实际上不仅仅是数组。只需养成在控制器结束时返回的习惯即可。

    编辑:更具体地说。它使用 new 关键字将函数作为构造函数调用。构造函数行为在This SO Post中指定

    【讨论】:

    • 是的,这肯定是解决方案。然而,我对它为什么这样做很感兴趣。
    • @StevenClontz 这是因为 Angular 在函数上使用了 'new' 关键字。因为它是一个构造函数,返回值就是实例,所以返回任何其他东西会让 javascript 认为那是你的实例。省略返回值会返回“this”,这将是控制器本身。由于coffeescript 是自动返回的,我们只剩下这种行为了:)
    • 太棒了,这正是我想要的。
    【解决方案2】:

    您可以使用 CoffeeScript class 关键字强制 CS 创建类构造函数:

    angular.module('myApp.controllers',[]).controller "HomeController", class
      constructor: ->
        @someArray = []
    

    或者,您可以创建命名类,然后将其传递给 angular.js:

    class HomeController
      constructor: ->
        @someArray = []
    
    angular.module('myApp.controllers',[]).controller "HomeController", HomeController
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 2013-06-26
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      相关资源
      最近更新 更多