【问题标题】:How to write Helper class in typescript? [duplicate]如何在打字稿中编写 Helper 类? [复制]
【发布时间】:2016-06-10 12:08:33
【问题描述】:

我在使用 typeScriptangular2 时遇到问题。
我想创建一个helper.ts 文件,导出许多可重复使用的常用分类/函数。
但是Helper class需要在构造函数中导入其他服务,所以当另一个类导入Helper class时,必须设置参数是那些服务。我不想要这个。

我怎么写Helper class,当import {Helper} from ..时我可以在任何地方使用

这是我的示例: Helper.ts

import {TranslateService, TranslatePipe} from 'ng2-translate/ng2-translate';
import {Inject, Component} from 'angular2/core';


@Component({
    providers: [TranslateService]
})

export class Helpper {
    public trans;
    public lang;
    public properties;

    constructor(trans: TranslateService) {
        this.trans = trans;
        //This is variable for translate function 
        this.lang = this.trans.currentLang;
        this.properties = this.trans.translations[this.lang];             
    }

    translate(key) {
        return this.properties[key];      
    }      
}

RenderTab.ts

import {Component, Inject, Injectable} from 'angular2/core';
import {Helper} from './helpper'

@Component({
    providers: [Helper]
})

export class RenderTab {
    public helper;

    constructor(helper: Helper) { 
        this.helper = helper;
    }

    render() {
        var test = this.helper.translate('string');
    }
}

主页.ts

import {Component, Inject, Injectable} from 'angular2/core';
import {RenderTab} from './RenderTab'

@Component({
    selector: 'div',
    templateUrl: './HomePage.html',
    providers: [RenderTab]
})

export class ColorPicker {
    public renderTab;

    constructor(renderTab: RenderTab) { 
        this.renderTab = renderTab;

        var test = this.renderTab.render();
    }
}

请帮帮我,谢谢。

【问题讨论】:

    标签: typescript angular


    【解决方案1】:

    Helper 类应该只包含静态函数或变量,否则它们与服务没有区别。 如果我弄错了,请纠正我。

    在没有Injectable 或将其添加到providers 的情况下创建Helper 类的一种方法发布在这里Thanks to k7sleeper

    复制上述帖子中的代码以供快速参考。

    utils.ts

    export default class Utils {
        static doSomething(val: string) { return val; }
        static doSomethingElse(val: string) { return val; }
    }
    

    用法:

    import Utils from './utils'
    export class MyClass {
        constructor()
        {
            Utils.doSomething("test");
        }
    }
    

    但是阅读更多关于此的信息,通过Injectableproviders 注入它们是有意义的,但我会仍然拥有static 和没有constructor的类

    【讨论】:

    • 整洁!正是我需要的。
    • 如何注入类并保持方法为静态?如果你注入它,你不能使用任何静态成员,因为你得到一个实例(命名让我们说utils),你仍然必须使用Utils.doSomething
    • 可以直接导出函数,为什么还要使用class
    • 为什么我们需要使用 Injectable?
    【解决方案2】:

    首先class Helper应该是一个服务class HelperClass,它应该是可注入的。

    import {Injectable} from "@angular/core";
    import {Http} from "@angular/http";
    import {TranslateService} from "ng2-translate";
    
    @Injectable()
    export class HelperService {
       constructor(private http: Http, private translateService: TranslateService) {
    
       }
    
    }
    

    现在您可以简单地注入此帮助程序并在您喜欢的任何组件中使用它。

    import {HelperService} from "./helper.service.ts";
    @Component({
       ...
    })
    export class MyComponent{
       constructor(public helperService: HelperService) {}
    }
    

    更新:你需要在根模块的providers数组中添加服务才能工作,或者对于angular6+,服务可以如下提供

    @Injectable({
      providedIn: 'root'
    })
    export class HelperService {
       ...
    }
    

    【讨论】:

    • 是否可以将帮助程序类设为静态,这样我们就不需要将帮助程序添加为属性,而是可以执行 Helper.whatever() 之类的操作?
    • @DanHastings 您可以为此使用函数,或者创建具有值和函数的对象。例如const Helper = { whatever: (a) => { a + 1} }
    • 好答案.. 只是指出根据命名约定它应该是服务名:HelperService 和文件名:helper.service.ts
    • @YosvelQuintero 更新了答案,谢谢
    【解决方案3】:

    您的 Helper 类对应于一个服务,由于您想在其中注入另一个服务,您需要添加 @Injectable 装饰器(不是 @Component 装饰器):

    Import {Injectable} from 'angular2/core';
    
    @Injectable()
    export class Helper {
      (...)
    }
    

    由于它是依赖注入的一部分,其构造函数的所有参数都将由 Angular2 自己提供。您无需自己提供它们并自己实例化此类即可。只需将其注入您想使用它的地方...

    您需要在引导您的应用程序时找到相应的提供程序:

    bootstrap(AppComponent, [ Helper ]);
    

    或者在组件级别,但只能在组件触发的处理中使用。

    @Component({
      (...)
      providers: [ Helper ]
    })
    export class SomeComponent {
      (...)
    }
    

    有关依赖注入和分层注入器的更多详细信息,您可以查看以下问题:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-26
      • 2022-01-02
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多