为什么ui路由无法从状态2解析状态1

Why ui-route cannot resolve state1 from state2?

本文关键字:状态 ui 路由 为什么      更新时间:2023-09-26

我有一个有两个视图(左手菜单和内容(的应用程序,它也有模块。当用户从组合列表中选择模块时,将使用所选的模块名称调用$state.go((,并相应地填充视图。下面的代码示例。

我使用Angular 1.5、ui路由器和typescript。

当我从组合列表中选择一个模块时,应用程序会抛出以下错误。

错误:无法从状态"主"解析"BFTS">

我不知道为什么。

到目前为止,我所做的是克服这个问题:

  • 检查params是否会在组合框中正确通过。它运行良好。

  • 我在这里查了很多问题和文件。与公认的答案相比,我看不出我的代码有什么不同。

奇怪的是,当加载应用程序时,"主页"状态是活动的,因为我可以在我期望的地方看到"主页模块"answers"主页内容"文本。

控制器,用户可以在其中选择模块。

module qa.gonogo {
    "use strict";
    export interface IHeaderComponentController {
    }

    export class HeaderComponentController implements IHeaderComponentController {
        public modules = <IGoNoGoModule[]>[
            {
                name: "BFTS",
                default: 1
            },
            {
                name: "Test Execution",
                default: 0
            },
            {
                name: "Data Analyzer",
                default: 0
            },
            {
                name: "Data Generator",
                default: 0
            },
            {
                name: "Build track",
                default: 0
            },
        ];
        public selectedModule = undefined;
        static $inject = ["moveToStateService"];
        constructor(
            private moveToStateService: IMoveToStateService
        ) { }
        public $onInit = (): void => {
        }
        public moduleSelected(goNoGoModule: IGoNoGoModule): void {
            console.log('selected: ', goNoGoModule);
            if (goNoGoModule === null || typeof goNoGoModule === 'undefined') {
                throw "Desired state name cannot be empty or null! " + goNoGoModule;
            }
            this.moveToStateService.moveToState(goNoGoModule.name);
        }
    }
    angular
        .module("goNoGo")
        .controller("headerComponentController", qa.gonogo.HeaderComponentController);
}

州:

((): void => {
    "use strict";
    angular
        .module("goNoGo")
        .config(config);
    config.$inject = ["$stateProvider", "$urlRouterProvider"];
    function config(
        $stateProvider: ng.ui.IStateProvider,
        $urlRouterProvider: ng.ui.IUrlRouterProvider
    ) {
        $urlRouterProvider.otherwise("/");
        $stateProvider
            .state("home",
            <ng.ui.IState>{
                url: "/",
                views: <any>{
                    "leftHandMenu": <ng.ui.IState>{
                        template: "home module"
                    },
                    "content": <ng.ui.IState>{
                        template: "home content"
                    }
                }
            })
            .state("bfts",
            <ng.ui.IState>{
                url: "/bfts",
                views: <any>{
                    "leftHandMenu": <ng.ui.IState>{
                        template: "bfts module"
                    },
                    "content": <ng.ui.IState>{
                        template: "bfts content"
                    }
                }
            })
    }
})();

状态将更改的服务:

module qa.gonogo {
    "use strict";
    export interface IMoveToStateService {
        moveToState(stateName: string): void;
    }
    class MoveToStateService implements IMoveToStateService {
        constructor(
            private $state: ng.ui.IStateService ) {
        }
        moveToState(stateName: string): void {
            console.log("state service:", stateName);
            this.$state.go(stateName, <any>{});
        }
    }
    factory.$inject = ["$state"];
    function factory(
        $state: ng.ui.IStateService
    ) {
        return new MoveToStateService($state);
    }
    angular
        .module("goNoGo")
        .factory("moveToStateService", factory);
}

正如我在评论中所写的那样-您定义了类似的状态

.state("bfts",

所以

<a ui-sref="BFTS">

将不起作用,因为路由的ui无法识别与该名称匹配的状态。但<a ui-sref="bfts">会起作用。