【问题标题】:'ShouldWorkController' is not a function. Got undefined'ShouldWorkController' 不是一个函数。未定义
【发布时间】:2015-03-02 02:48:00
【问题描述】:

当我尝试使用 angular-ui-router $stateProvider 将控制器绑定到模板时,我遇到了以下错误:

'ShouldWorkController' is not a function. Got undefined.

但是,当我使用 ng-controller 在模板中声明控制器时,一切正常。这里有什么问题?

app.ts

module App {

    var dependencies = [
        MyControllers            
    ]

    function configuration($stateProvider: ng.ui.IStateProvider) {

        $stateProvider
            .state("shouldWork", {
                url: "/shouldWork",
                templateUrl: "app/shouldWork.html"
                controller: "ShouldWorkController" // does not work
           });
    }
}

shouldWorkController.ts

module App.MyControllers {

    interface IShouldWorkViewModel {

    }

    class ShouldWorkController implements IShouldWorkViewModel {}

}

ShouldWork.html

<div ng-controller="ShouldWorkController as viewModel" us-spinner spinner-key="spinner-1">
                 ^ --- this works nicely

【问题讨论】:

    标签: javascript angularjs typescript angular-ui-router


    【解决方案1】:

    该消息意味着,这样的 controller "ShouldWorkController" 没有加载到他的主要角度 module 中。确保你在最后调用 register:

    module App.MyControllers {    
        ...
        class ShouldWorkController implements IShouldWorkViewModel {}    
    }
    
    // we have to register this controller into some module (MyControllers)
    // which is also referenced in the main app module
    angular.module('MyControllers')
        .controller('ShouldWorkController', App.MyControllers.ShouldWorkController ); 
    

    【讨论】:

    • 我正在使用 grunt-tsng,它会在构建时自动注册控制器等,它也可以正常工作(否则模板内的控制器声明无论如何都不起作用)。
    • 消息很清楚 - angular.module('app', [..]) 无法访问您的控制器。这就是信息。因此,通过您的咕噜声进行的注册无法正常工作。主模块没有注册这样的名称。有帮助吗?
    • 我明白你在说什么,这对我来说毫无意义,因为这里需要的一切都在那里(并且使用'ng-controller'绑定控制器工作得很好)。摘自生成的 js 代码:(function (App) { function (MyControllers) { var ShouldWorkController = (function ()... 及以后的angular.module("App.MyControllers").controller("ShouldWorkController,
    • 现在的重点是:我真的会怀疑:模块应用程序缺少控制器模块。检查两次你看到angular.module("App", ["App.MyControllers", ...])。这将是 95% 的原因。剩下的 5% 是你的控制器生成的文件没有嵌入到页面中。我真的几乎可以肯定......
    【解决方案2】:

    我意识到这已经过时了,但我通过 Google 来到这里时遇到了同样的问题,而不是第一次。需要检查的事项包括:

    1. 您的控制器类的导出语句。 从您发布的代码中,我看到您缺少 ShouldWorkController 类的 export 语句。在您的情况下,这可能不是问题,但您应该检查一下。我可以通过从控制器类中删除导出语句来重现此错误。
    2. 检查您的 HTML 模板是否存在(如果使用 UI-Router)。 如 UI-Router 文档中所述:“如果未定义模板,则不会实例化控制器。”
    3. 在与控制器相同的文件中注册您的控制器。 一些教程确实演示了在模块文件中注册控制器。虽然这确实有效,但我个人发现它比直接在控制器文件中注册控制器更容易出错。
    4. 检查您的打字稿参考。确保将 typescript 引用(例如 ///&lt;reference path="../app/services/shouldWorkService.ts"&gt;)添加到包含您引用的任何类型的 typescript 文件中
    5. 检查控制器名称是否与 $stateProvider 配置中声明的名称匹配。

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      相关资源
      最近更新 更多