2017-05-30 21 views
0

我有一個簡單的表單驗證器函數。從表單驗證器函數訪問單例服務

static required(control: FormControl) { 
if (control.value == null || control.value.length <= 0) 
     return {'required': false, 'errorMsg': 'Value is required'} 
    return null 
} 

我想改變它,所以它沒有返回一個硬編碼errorMsg而是一個本地化的消息。問題在於它拒絕與我的本地化服務(稱爲LocaleService)一起工作。

該服務有一個叫做locale的單一道具。這是一個包含所有本地化消息的JSON對象。在組件中使用起來非常簡單:我只是在構造函數中創建一個私有實例,然後它就可以訪問了。

但驗證器類不希望這樣。對於初學者來說,如果我嘗試這樣做:

import {LocaleService} from '../services/locale.service'; 
export class FormValidators { 

    constructor(private _localeService: LocaleService) {} 

    static required(control: FormControl) { 
     if (control.value == null || control.value.length <= 0) 
      return {'required': false, 'errorMsg': 'Value required'} 
     return null 
    } 
} 

整個事情立即打破,甚至不會建立。該錯誤信息是:

Uncaught Error: Can't resolve all parameters for FormValidators: (?). 

我試圖創建靜態函數內部的LocaleService一個實例,但它不會允許的。它也不允許將其作爲參數傳遞或從全局變量中獲取它。這總是一個錯誤。

那麼我怎樣才能得到這個功能與服務交談?

+0

是你的LocaleService'@ Injectable'? –

+0

是的,它是@Injectable。 –

回答

0

這是解決方案。作爲提供者的單件服務應僅在app.module.ts[providers]部分中定義。我的錯誤是將其添加到我的AppComponent,這導致DI在服務中創建新的實例,但不是在子組件中。