【问题标题】:Why isn't the child controller being loaded为什么没有加载子控制器
【发布时间】:2019-01-16 15:33:27
【问题描述】:

我正在尝试创建一个父子控制器结构,其中包含父控制器中所有子控制器所需的通用功能。当我尝试从不相关的状态更改为其中一个子状态时,仅运行父控制器。

我尝试过使用抽象控制器、声明孩子和父母的所有不同形式(使用点表示法、使用 parent = 'parentControllerName'),但似乎没有任何效果。

代码中某处的随机控制器

changeToLoginEmail() => {
    $state.go('login.email');
}

当我调用 changeToLoginEmail 时,它会通过我的 routes.js 进行路由

angular.module('myModule')
    .config(['$stateProvider', function ($stateProvider) {

            $stateProvider
                .state('login', { // Parent Controller
                    abstract: true,
                    url: '/login',
                    views: {
                        "master": {
                            controller: 'loginController'
                        }
                    }
                })
                .state('login.email', { // One of the children
                    url: '/login/email',
                    views: {
                        "email": {
                            controller: 'loginEmailController',
                            templateUrl: '/components/loginEmail/loginEmailView.html'
                        }
                    }
                })
    }
]);

这是两个控制器:

登录控制器:

(() => {
    'use strict';

    angular
        .module('myModule')
        .controller('loginController', loginController);

    function loginController($scope, $state) {
        console.log("state", $state);
        console.log("scope", $scope);
    }

    loginController.$inject = ['$scope', '$state'];
})()

登录电子邮件控制器:

(() => {
    'use strict';

    angular
        .module('myModule')
        .controller('loginEmailController', loginEmailController);

    function loginEmailController($scope, $state) {
        console.log("I was loaded woopie");
    }

    loginEmailController.$inject = ['$scope', '$state'];
})()

我希望先加载父控制器,然后再加载子控制器。但是,控制台中只打印了前两个 console.log,而 loginEmailController 的 console.log 永远不会运行。结果是没有加载任何视图。

有人知道为什么吗?

【问题讨论】:

  • 你确定你在孩子中需要/login/email作为'url',而不仅仅是/email
  • 目前我还不确定。但两种变体都不起作用。看来这确实是不必要的,所以谢谢你 :) 问题仍然存在。
  • 按照弗兰克的建议 - 尝试将 url: '/login/email', 更改为 url: '/email',
  • 如果您访问 /login/login/email 这个链接到浏览器,您将看到日志是按顺序打印的。
  • 感谢您发现网址错误,已修复,不会造成任何问题。尽管如此,子控制器仍然没有运行

标签: javascript angularjs angular-ui-router frontend


【解决方案1】:

使用状态的默认视图集。

...
views: {
    '': {
           controller: 'loginController'
     }
}
...

...
views: {
      '': {
          controller: 'loginEmailController',
          templateUrl: '/components/loginEmail/loginEmailView.html'
      }
}
...

【讨论】:

  • 谢谢,这是我遇到的许多问题中较大的一个。基本上,通过给我的视图命名(“电子邮件”),它没有被加载。此外,我还需要在父状态中包含一个空的 ui-view。把这两个放在一起,它就开始工作了:)
猜你喜欢
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
相关资源
最近更新 更多