由ng-include加载的控制器不起作用 [英] Controller loaded by ng-include not working
问题描述
我有一个带有弹出窗口的页面,我在多个页面上都使用该窗口,然后使用ng-include加载它.在此弹出窗口中,还使用ng-include动态加载了三个选项卡.
I have a page with a pop-up I use on several pages and I load it using ng-include. In this pop-up there is three tabs also dynamically loaded using ng-include.
所以我的代码如下:
<div ng-include="'/pages/ng-templates/Cockpit.html'"></div>
Cockpit.html
中,我有以下代码:
in Cockpit.html
I have the following code:
<div id="dlgCockpit" class="Cockpit jquerydialog">
<div id="tabs">
<ul>
<li><a href="#tabA">tabA</a></li>
<li><a href="#tabB">tabB</a></li>
<li><a href="#tabC">tabC</a></li>
</ul>
<div id="tabA">
<div ng-include="'/pages/ng-templates/Cockpit-A.html'"></div>
</div>
<div id="tabB">
<div ng-include="'/pages/ng-templates/Cockpit-B.html'"></div>
</div>
<div id="tabC">
<div ng-include="'/pages/ng-templates/Cockpit-C.html'"></div>
</div>
</div>
</div>
<script src="/pages/ng-templates/scripts/Cockpit.js"></script>
在Cockpit-A.html
中,我有以下代码:
<div id="dlgCockpitA">
<form name="frmA" class="cntrCockpitA form" ng-controller="AController">
<!-- some inputs using ng-model -->
</form>
</div>
<script src="/pages/ng-templates/scripts/Cockpit-A.js"></script>
Cockpit.js
:
function showCockpit(vsTnID, vsBenutzer) {
$('#dlgCockpit').data('tnid', vsTnID);
var $dialog = $("#dlgCockpit")
.dialog({
autoOpen: false,
title: locBenutzer + ': ' + vsBenutzer + ' (ID: ' + vsTnID + ')',
width: 1000,
show: 'fade',
resizable: false,
open: function (event, ui) {
$("#tabs").tabs({ active: 0 });
angular.element($('.cntrCockpitA')).scope().showStammdaten(vsTnID, 'Standard');
},
close: function (event, ui) {
}
});
$dialog.dialog('open');
return false;
}
Cockpit-A.js
:
app.controller('AController', ['$scope', '$http', function ($scope, $http) {
//some function definitions on $scope
}]);
当我加载页面时,我会在javascript控制台中看到以下内容:
When I load the page I get the following in the javascript console:
Error: [ng:areq] Argument 'AController' is not a function, got undefined
http://errors.angularjs.org/1.2.26/ng/areq?p0=StammdatenController&p1=not%20aNaNunction%2C%20got%20undefined
at http://localhost:63323/scripts/angular/angular-1.2.26.js:78:12
at assertArg (http://localhost:63323/scripts/angular/angular-1.2.26.js:1509:11)
at assertArgFn (http://localhost:63323/scripts/angular/angular-1.2.26.js:1519:3)
at http://localhost:63323/scripts/angular/angular-1.2.26.js:7278:9
at http://localhost:63323/scripts/angular/angular-1.2.26.js:6670:34
at forEach (http://localhost:63323/scripts/angular/angular-1.2.26.js:332:20)
at nodeLinkFn (http://localhost:63323/scripts/angular/angular-1.2.26.js:6657:11)
at compositeLinkFn (http://localhost:63323/scripts/angular/angular-1.2.26.js:6105:13)
at compositeLinkFn (http://localhost:63323/scripts/angular/angular-1.2.26.js:6108:13)
at publicLinkFn (http://localhost:63323/scripts/angular/angular-1.2.26.js:6001:30)
调用showCockpit
时,在angular.element($('.cntrCockpitA')).scope().showStammdaten(vsTnID, 'Standard');
行中出现以下错误:
When calling showCockpit
I get the following error in the line angular.element($('.cntrCockpitA')).scope().showStammdaten(vsTnID, 'Standard');
:
Uncaught TypeError: undefined is not a function
实际上,如果我将Cockpit-A.js
的脚本标记放在包含Cockpit.html
的基础页面"中,或者如果我仅通过调用function AController($scope, $http) { ... }
创建控制器,则一切正常,但是这两个都不是选项.
Actually everything works if I put the script tag for Cockpit-A.js
in the "base page" which is including Cockpit.html
or if I create the Controller just by calling function AController($scope, $http) { ... }
, but both of those are not an option.
推荐答案
我遇到了完全相同的问题.由于以下原因找到了解决方案: http://ify.io/lazy-loading-in-angularjs/
I had the exact same problem. Found a solution thanks to: http://ify.io/lazy-loading-in-angularjs/
基本上,引导应用程序后,无法使用app.controller(...).我建议阅读链接以获取更多信息.解决方案是先保存controllerProvider并使用它注册模块.
Basically, it is not possible to use app.controller(...) after bootstrapping the app. I suggest reading the link for more information. The solution is to save the controllerProvider ahead and use it to register the module.
var app = angular.module('myModule', []);
app.config(function($controllerProvider) {
app.controllerProvider = $controllerProvider;
});
// Later on... after bootstrapping...
app.controllerProvider.register('myController', function() {... });
这篇关于由ng-include加载的控制器不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!