【问题标题】:ui router - nested views with shared controller not workingui路由器-共享控制器的嵌套视图不起作用
【发布时间】:2017-02-11 11:15:44
【问题描述】:

在我有一个作为我的应用程序主体的主控制器之前,我有一个抽象父视图,它旨在与它的嵌套视图共享一个控制器

.state('main', {
    abstract: true,
    url: '/',
    templateUrl: 'app/templates/main.html',
    controller: 'mainController'
})

.state('main.edit', {
    abstract: true,
    url: '/edit',
    templateUrl: 'app/templates/edit.html',
    controller: 'editController'
})
.state('main.edit.details', {
    url: '/details',
    templateUrl: 'app/templates/editDetailsView.html',
    controller: 'editDetailsController'
})
.state('main.edit.info', {
    url: '/info',
    templateUrl: 'app/templates/editInfoView.html',
    controller: 'editInfoController'
})

路由按预期工作,在我设置 de 控制器之前,我有模块的父控制器,它将是编辑控制器和每个视图的每个控制器

错误:

"Error: [ng:areq] Argument 'editController' is not a function, got undefined
http://errors.angularjs.org/1.5.7/ng/areq?p0=editController&p1=not%20aNaNunction%2C%20got%20undefined
minErr/<@http://localhost:3000/js/libs.min.js:5:4923
assertArg@http://localhost:3000/js/libs.min.js:5:19120
assertArgFn@http://localhost:3000/js/libs.min.js:5:19322
$ControllerProvider/this.$get</<@http://localhost:3000/js/libs.min.js:7:31336
z/<.compile/<@http://localhost:3000/js/libs.min.js:15:2556
bind/<@http://localhost:3000/js/libs.min.js:5:12865
invokeLinkFn@http://localhost:3000/js/libs.min.js:7:22121
nodeLinkFn@http://localhost:3000/js/libs.min.js:7:4193
compositeLinkFn@http://localhost:3000/js/libs.min.js:6:26125
compile/<@http://localhost:3000/js/libs.min.js:6:24834
compilationGenerator/<@http://localhost:3000/js/libs.min.js:6:31172
l@http://localhost:3000/js/libs.min.js:15:1755
y/l.compile/<@http://localhost:3000/js/libs.min.js:15:2183
bind/<@http://localhost:3000/js/libs.min.js:5:12865
invokeLinkFn@http://localhost:3000/js/libs.min.js:7:22121
nodeLinkFn@http://localhost:3000/js/libs.min.js:7:4193
compositeLinkFn@http://localhost:3000/js/libs.min.js:6:26125
compile/<@http://localhost:3000/js/libs.min.js:6:24834
z/<.compile/<@http://localhost:3000/js/libs.min.js:15:2764
bind/<@http://localhost:3000/js/libs.min.js:5:12865
invokeLinkFn@http://localhost:3000/js/libs.min.js:7:22121
nodeLinkFn@http://localhost:3000/js/libs.min.js:7:4193
compositeLinkFn@http://localhost:3000/js/libs.min.js:6:26125
compile/<@http://localhost:3000/js/libs.min.js:6:24834
compilationGenerator/<@http://localhost:3000/js/libs.min.js:6:31172
l@http://localhost:3000/js/libs.min.js:15:1755
y/l.compile/</<@http://localhost:3000/js/libs.min.js:15:2175
$RootScopeProvider/this.$get</Scope.prototype.$broadcast@http://localhost:3000/js/libs.min.js:9:24515
v/y.transitionTo/y.transition<@http://localhost:3000/js/libs.min.js:14:29498
processQueue@http://localhost:3000/js/libs.min.js:9:8733
scheduleProcessQueue/<@http://localhost:3000/js/libs.min.js:9:9000
$RootScopeProvider/this.$get</Scope.prototype.$eval@http://localhost:3000/js/libs.min.js:9:22223
$RootScopeProvider/this.$get</Scope.prototype.$digest@http://localhost:3000/js/libs.min.js:9:19908
$RootScopeProvider/this.$get</Scope.prototype.$apply@http://localhost:3000/js/libs.min.js:9:22650
done@http://localhost:3000/js/libs.min.js:8:7950
completeRequest@http://localhost:3000/js/libs.min.js:8:11757
createHttpBackend/</xhr.onload@http://localhost:3000/js/libs.min.js:8:12689
"

如果我删除了editController,它工作得很好,但是如果我需要我的视图的共享控制器,我该怎么办,如果我像这样设置父控制器,它可以工作

.state('main.edit', {
        abstract: true,
        url: '/edit',
        templateUrl: 'app/templates/edit.html',
        controller: function($scope){
          console.log('edit parent controller');
        }

不是这个想法。

【问题讨论】:

  • 发布editController的代码。
  • 您似乎忘记指定控制器,或者控制器名称中有错字。
  • 在每个控制器中我只有一个console.log,没有别的
  • angular.module('app.edit', []) .controller('editController', ['$scope', function($scope, $state) { console.log('edit' ); }]);

标签: angularjs angular-ui-router


【解决方案1】:

我花了 24 小时试图找到这个。我正要发布一个问题/添加到您的问题,但我终于找到了我的问题。 就我而言,在重构为推荐的格式(模块定义、控制器定义、服务定义等的单独文件)后,我将 [] 留在了一些控制器定义文件中,如下所示:

(function () {
'use strict';

angular
    .module('app.landing', [])
    .controller('LandingController', LandingController);

那是覆盖已经创建的 app.landing 模块。在检查并清理了所有使用这些模块引用的模块定义和组件定义之后,现在一切正常。唷。

(function () {
'use strict';

angular
    .module('app.landing')
    .controller('LandingController', LandingController);

有趣的是,我阅读了这个问题的 S/O 答案,即Error: [ng:areq] from angular controller,但我无法在 2 个文件中发现那些疯狂的括号。这让我有点质疑 Angular 团队认可的最佳实践,就好像我将所有内容都放在一个文件中一样,这不是问题。当我有 50 个文件要查看并且我一直盯着屏幕几个小时时,这非常具有挑战性。我希望检查多个模块定义。

【讨论】:

    猜你喜欢
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 2017-10-05
    • 2015-12-06
    • 2016-10-10
    相关资源
    最近更新 更多