使用 Coffeescript 设置 AngularJS 控制器属性不能是最后一行

Posted

技术标签:

【中文标题】使用 Coffeescript 设置 AngularJS 控制器属性不能是最后一行【英文标题】:Setting AngularJS controller property cannot be last line using Coffeescript 【发布时间】: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' 这样的命令来解决这个问题。但真正奇怪的是,只有当函数的最后一行返回一个数组时,这才会搞砸。怎么回事?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于使用 Coffeescript 设置 AngularJS 控制器属性不能是最后一行的主要内容,如果未能解决你的问题,请参考以下文章

CoffeeScript中对于在NetBeans 8.0插件:设置目标文件夹JS编译

在编译字符串插值实例时,Coffeescript是否始终使用ES6模板文字?

Ember.JS && Coffeescript

什么是对的CoffeeScript + NPM的最佳做法?

从木偶中的父级扩展 Coffeescript 子类函数

如何在 Slim 模板中访问 CoffeeScript 引擎中的实例变量