【问题标题】:Unable to CoffeeScript AngularJS module to load with ng-app in JSFiddle无法在 JSFiddle 中使用 CoffeeScript AngularJS 模块加载 ng-app
【发布时间】:2015-06-29 00:56:06
【问题描述】:

我正在使用 Coffeescript 和 AngularJS,尝试使用新的“controller as”语法。尽管进行了各种尝试和搜索谷歌,但我无法让它工作 - 我的 html 中的控制器引用没有找到控制器的 Coffeescript 类。

我怀疑我做错了什么或只是误解了一些事情,但如果有人有一个可行的例子,那将非常有帮助。

这是一个小 jsfiddle,显示了我正在尝试做的事情:http://jsfiddle.net/G2r4p/(此示例中的控制器只是一个空的虚拟控制器,因此我可以测试语法)。

当我在浏览器中运行此示例时,我得到:

Error: [ng:areq] Argument 'AppController' is not a function, got undefined
at hasOwnPropertyFn (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.js:60:12)
at assertArg (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.js:1187:11)
at assertArgFn (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.js:1197:3)
at $get (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.js:5547:9)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.js:5060:34
at forEach (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.js:203:20)
at nodeLinkFn (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.js:5047:11)
at compositeLinkFn (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.js:4607:15)
at compositeLinkFn (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.js:4610:13)
at publicLinkFn (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.js:4516:30) 

谢谢

【问题讨论】:

标签: angularjs coffeescript jsfiddle


【解决方案1】:

JS Fiddle 是罪魁祸首。当我在JS Bin 中尝试时,您的语法是正确的并且工作正常。看起来 JS Fiddle 正在处理一些乱序的东西,而 JS Bin 并没有遇到这个问题。

查看有效的 JS Bin 示例:http://jsbin.com/akABEjI/1/edit

您可能还对我的博客文章感兴趣,该文章采用 AngularJS Todo 应用程序并将其转换为 CoffeeScript:"Writing AngularJS controllers with CoffeeScript classes." 最终,您的示例与我在最后一个示例中的最终示例相似。

【讨论】:

  • 我已经看到了(非常有用,也很清楚)。我想不通的是我到底做错了什么!
  • 知道了,感谢您的博客。我逐渐删除了一些东西,直到它停止工作。问题是当我尝试它时,我在一个单独的文件中将控制器注册到控制器定义中,即我在与 AppController.coffee 不同的文件中调用了 .controller("AppController", AppController)。大概是由于咖啡脚本的作用域,控制器没有正确注册。
  • @matthelliwell 很高兴它有帮助。最初让 CoffeeScript 类工作起来很棘手,这引导我逐步完成了慢慢构建它的过程。
  • @AhmadMageed 感谢您的帖子和博客。我想使用咖啡脚本类,但想避免“控制器为”,因为我在 module.config 中定义路由。这可能吗?
  • @bob 我博客上的倒数第二个示例演示了没有as 语法的控制器。这是direct JS Bin link to the example。希望有帮助!
【解决方案2】:

我对你的代码做了一些修改,现在可以使用了 (http://jsfiddle.net/denisonluz/r5KQb/2/)

还请记住,有时在使用 JSFiddle 时使 AngularJS 工作可能有点棘手。有一篇关于它的好帖子here。在 JSFiddle 上使用 AngularJS 和 CoffeScript 时,您必须使用手动引导。

COFFESCRIPT

testApp = angular.module 'testApp', []

testApp.controller 'AppController', ($scope) ->
    $scope.items = [{title: "My test App", description: 'Some Text Here'}]

angular.bootstrap document, ["testApp"]

HTML

<div ng-controller='AppController'>
<h3>one plus two is {{1 + 2}}</h3>
  <ul ng-repeat='item in items'>
    <li>{{item.title}}</li>
    <li>{{item.description}}</li>
   </ul>
</div>

【讨论】:

  • 抛开 jsfiddle 问题,这是一个不幸的红鲱鱼,我可以让代码像你的例子一样。但是,我试图让“控制器作为”语法工作,以便视图可以直接访问我的控制器类,而不是使用 $scope。这里有一个很好的视频:thinkster.io/pick/GmI3KetKo6/…
【解决方案3】:

问题不是你的 CoffeeScript,而是 JSFiddle。

问题在于 JSFiddle 执行 CoffeeScript 的方式,在 Angular 尝试使用您的 ng-app="TestApp" 指令引导应用程序之后,它会处理 CS 并执行创建的 JavaScript。

虽然@dluz“解决”了这个问题,但它没有解释它。

一种解决方案是手动引导您的应用程序,正如 @dluz 建议的那样,但您不必也不应该在生产环境中执行此操作。

理想情况下,在生产环境中,您将预处理您的 CoffeeScript,它永远不会在浏览器中编译为 JavaScript,就像在 JSFiddle 中一样。

【讨论】:

  • 问题是,如果我编译 Coffeescript 并在本地服务器上运行它,我会遇到同样的问题,所以虽然 jsfiddle 可能会增加不必要的复杂性,但我仍然遇到了问题。事后看来,我应该只是发布代码示例并将 jsfiddle 排除在外。
【解决方案4】:

这是一个简单的例子,咖啡脚本、角和玉并排工作

doctype html
html(lang="en")
    head
        meta(charset="utf-8")
        title Test
        script(src='https://ajax.googleapis.com/ajax/libs/angularjs/1.4.1/angular.js')
        script(src='http://coffeescript.org/extras/coffee-script.js')
        style.
            input { width: 200px }

        script(type='text/coffeescript').
            app = angular.module('App', [])
            app.controller 'TestController', ($scope)->
                $scope.name = 'Angular 1.4 with Jade with coffee'
            angular.bootstrap document, ["App"]

    body
        div
            div(ng-controller="TestController")
                h2 {{name}}
                hr
                input(type="text" ng-model="name" )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 2015-02-09
    • 2012-10-10
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    相关资源
    最近更新 更多