在 Typescript 中将 $state 和 $stateParams 的引用添加到 $rootScope(角度)

Posted

技术标签:

【中文标题】在 Typescript 中将 $state 和 $stateParams 的引用添加到 $rootScope(角度)【英文标题】:Add reference to $state and $stateParams to $rootScope in Typescript (angular) 【发布时间】:2015-03-02 03:05:51 【问题描述】:

我正在尝试根据当前状态的数据(在 ui-router 中配置)设置我的 Angular 应用的页面标题。

 <title ng-bind="$state.current.data.pageTitle></title>

在这个link 上,我发现了以下将$state/$stateParams 的引用添加到根范围:

.run([ '$rootScope', '$state', '$stateParams',
    function ($rootScope, $state, $stateParams) 
        $rootScope.$state = $state;
        $rootScope.$stateParams = $stateParams;
    ])

如何将其翻译成打字稿?

 function run($rootScope: ng.IRootScopeService, $state : ng.ui.IState, $stateParams : ng.ui.IStateParamsService) 
    $rootScope.$state // 'state' cannot be resolved

【问题讨论】:

【参考方案1】:

更新:此答案的先前版本不适用于角度严格模式或缩小。

因此我建议将此ng-strict-di 指令添加到index.html

<html data-ng-app="App" ng-strict-di> // see ng-strict-di
  <head>

这表明正确的方法是:

module App

    export class RootConfig
    
        static inject = ['$rootScope', '$state', '$stateParams'];

        constructor(
            $rootScope: any, //ng.IRootScopeService,
            $state: ng.ui.IStateProvider,
            $stateParams: ng.ui.IStateParamsService)
        
            $rootScope.$state = $state;
            $rootScope.$stateParams = $stateParams;
        
    


angular.module('App')
    // wrong - not working in minified world
    // .run(App.RootConfig);
    // correct
    .run(['$rootScope', '$state', '$stateParams', App.RootConfig]);

为什么是 $rootScope: any, //ng.IRootScopeService, 而不是 $rootScope: ng.IRootScopeService,?为了让生活更轻松......并快速分配未声明的属性$state$stateParams

【讨论】:

@xvdiff 不得不说对不起,我的回答是半途而废。按照我的更新所示进行更改非常重要,以避免以后出现任何缩小问题 您还可以创建一个扩展IRootScopeService 的接口以添加$state$stateParams,例如interface ICustomRootScopeService extends ng.IRootScopeService $state: ng.ui.IStateProvider; $stateParams: ng.ui.IStateParamsService; (请原谅格式化。【参考方案2】:

我找到了一条比设置为any更干净的路由

declare module app 
    interface IScope extends ng.IScope 
        $root:IRootScopeService
    

    interface IRootScopeService extends ng.IRootScopeService 
        $state:ng.ui.IStateService
    

然后要使用它,只需声明如下

constructor(
        $rootScope: app.IRootScopeService,
        $state: ng.ui.IStateProvider

    $rootScope.$state = $state;

【讨论】:

除了 Marius 的答案之外,我还回答了一个不同的问题,它将保持 declaration 模块化。 ***.com/a/37225633/4742733

以上是关于在 Typescript 中将 $state 和 $stateParams 的引用添加到 $rootScope(角度)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vue 2 和 TypeScript 中将 $refs 字段转换为其组件类型?

在 TypeScript 和 NestS 中将类转换为类/对象(实体到 DTO)

在 Typescript 和 AWS Lambda 中将 DynamoDB 数据格式化为普通 JSON

如何在 Typescript 中将具有动态键的对象设置为 React 状态

如何在 Typescript 中将 ref prop 和 useRef 与 Lottie 文件一起使用?

如何在同一个项目中将 Typescript 与 Angular CLI 和 Express/Node 一起使用?