【问题标题】:AngularJS: Error 'Controller is not defined' when calling abstract controllers from another controllerAngularJS:从另一个控制器调用抽象控制器时出现错误“未定义控制器”
【发布时间】:2014-05-13 06:45:20
【问题描述】:

在我的 Angular JS 应用程序中,我有 2 个页面使用相同的功能,我正在尝试使用抽象控制器,但我从 Summary Ctrl 收到“未定义基本 Ctrl”错误。

我有什么遗漏吗...

标记

<div ng-controller="MainCtrl">
   <div ng-controller="SummaryCtrl">{{name}}</div>
   <div ng-controller="SearchCtrl"></div>
</div>

MaintCtrl.js

 define(['tabs/module'], function (module) {
   'use strict';
   module.controller('MainCtrl', ['$scope', function ($scope) {
    //some code;
   }]);
   function BaseCtrl($scope) {
     $scope.name="test";
   }
});

SummaryCtrl.js

 define(['tabs/summary/module'], function (module) {
   'use strict';
   module.controller('SummaryCtrl', ['$scope', function ($scope) {
    BaseCtrl($scope);
    //child actions`enter code here`
      $scope.name = 'Clicked from base controller';      
   }]);
});

【问题讨论】:

  • 你的问题对我来说有点不清楚。但它看起来不像 BaseCtrl 在你的例子中是抽象的......如果你创造了一些闻起来像它(或应该是)服务的东西? (那么你也需要注入它。你只是隐式调用BaseCtrl,这违反了约定)如果我错了,请纠正我......或者你能提供更多关于你想要什么的细节达到?
  • 我已经修改了上面的代码。我正在尝试创建一个抽象控制器 BaseCtrl 并在 SummaryCtrl 中使用它,我得到 BaseCtrl is not defined 错误。

标签: angularjs


【解决方案1】:

在我看来,您正在使用此代码作为示例:

Angular: Extending controller

我仍然不能 100% 确定您的问题是什么,但在我看来,在您提供的这个示例中,这两个代码段都在同一个文件中。当您将它分成单独的文件时,请确保在引导或添加 *.js 文件引用时。确保在“依赖”它的其他文件之前添加基础

EG

<script language="javascript" src="someUrl/BaseCtrl.js"></script>
<script language="javascript" src="someUrl/SummaryCtrl.js"></script>

编辑:

您的问题可能与 RequirejJS 有关

看看

http://solutionoptimist.com/2013/09/30/requirejs-angularjs-dependency-injection/

您的 MainModule 已在“选项卡/模块”中注册,但您没有在任何地方提供 SummaryCtrl 任何它的依赖项。

EG。 SummaryCtrl 并没有隐含地知道 'tabs/module',因为它在 'tabs/summary/module' 中

尝试将其添加到摘要中:

 define(['tabs/summary/module', 'tabs/module'], function (module, BaseCtrl) {
   'use strict';
   module.controller('SummaryCtrl', ['$scope', function ($scope) {
    BaseCtrl($scope);
    //child actions`enter code here`
      $scope.name = 'Clicked from base controller';      
   }]);
});

【讨论】:

  • 谢谢,是的,它看起来更像是 requirejs 依赖问题。如果我将函数放在选项卡/模块中,并且该模块中的控制器只能使用它,而不能在其他模块中的控制器中使用。什么是最好的实践使用 angualrjs 抽象使用 requirejs 是作为函数使用还是作为单独的 js 文件使用?
  • 我已经尝试了将选项卡/模块的依赖项添加到摘要的第二个选项,现在我在 SummaryCtrl 中得到“未定义不是函数”。
  • 谢谢你,我已经用你的解决方案解决了这个问题。创建了名为 BaseCtrl 的抽象函数并将 BaseCtrl 注入到 SummaryCtrl 并可以从中调用方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多