2017-01-09 4 views
0

Как я могу использовать Angular Material с TypScript в виде кода?Тип машинописи: использование частного объекта в статической функции

Например, я не хочу писать в любом месте, где я использую закусочной это:

constructor(public snackBar: MdSnackBar) {} 


*** 
this.snackBar.open('text', { 
    duration: 500 
}); // and i need to add this yet 10 times: no to good 
*** 

я хочу, чтобы создать отдельный класс, и вызвать только его (статическая функция), как:

constructor(private snackBar: MdSnackBar) { 
} 

public static showSnackBar(text: string, config: string): void { 
    this.snackBar.open(text, config); 
} 

, но так как я получил сообщение об ошибке:

Property 'snackBar' does not exist on type 'typeof SnackBar'.

, когда я преобразовать мой код:

static snackBar: MdSnackBar; 

    constructor() { 
    } 

    public static showSnackBar(text: string, config: string): void { 
    SnackBar.snackBar.open(text); 
    } 

и вызывать его из другого классифицирован, я получил:

EXCEPTION: Cannot read property 'open' of undefined 
ErrorHandler.handleError @ error_handler.js:47 
next @ application_ref.js:272 
schedulerFn @ async.js:82 
SafeSubscriber.__tryOrUnsub @ Subscriber.js:223 
SafeSubscriber.next @ Subscriber.js:172 
Subscriber._next @ Subscriber.js:125 
Subscriber.next @ Subscriber.js:89 
Subject.next @ Subject.js:55 
EventEmitter.emit @ async.js:74 
NgZone.triggerError @ ng_zone.js:278 
onHandleError @ ng_zone.js:257 
ZoneDelegate.handleError @ zone.js:236 
Zone.runTask @ zone.js:157 
ZoneTask.invoke @ zone.js:335 
error_handler.js:52 ORIGINAL STACKTRACE: 
ErrorHandler.handleError @ error_handler.js:52 
next @ application_ref.js:272 
schedulerFn @ async.js:82 
SafeSubscriber.__tryOrUnsub @ Subscriber.js:223 
SafeSubscriber.next @ Subscriber.js:172 
Subscriber._next @ Subscriber.js:125 
Subscriber.next @ Subscriber.js:89 
Subject.next @ Subject.js:55 
EventEmitter.emit @ async.js:74 
NgZone.triggerError @ ng_zone.js:278 
onHandleError @ ng_zone.js:257 
ZoneDelegate.handleError @ zone.js:236 
Zone.runTask @ zone.js:157 
ZoneTask.invoke @ zone.js:335 
error_handler.js:53 TypeError: Cannot read property 'open' of undefined 
    at Function.SnackBar.showSnackBar (snack-bar.ts:13) 
    at SafeSubscriber._next (edit.component.ts:78) 
    at SafeSubscriber.__tryOrUnsub (Subscriber.js:223) 
    at SafeSubscriber.next (Subscriber.js:172) 
    at Subscriber._next (Subscriber.js:125) 
    at Subscriber.next (Subscriber.js:89) 
    at CatchSubscriber.Subscriber._next (Subscriber.js:125) 
    at CatchSubscriber.Subscriber.next (Subscriber.js:89) 
    at MapSubscriber._next (map.js:83) 
    at MapSubscriber.Subscriber.next (Subscriber.js:89) 
ErrorHandler.handleError @ error_handler.js:53 
next @ application_ref.js:272 
schedulerFn @ async.js:82 
SafeSubscriber.__tryOrUnsub @ Subscriber.js:223 
SafeSubscriber.next @ Subscriber.js:172 
Subscriber._next @ Subscriber.js:125 
Subscriber.next @ Subscriber.js:89 
Subject.next @ Subject.js:55 
EventEmitter.emit @ async.js:74 
NgZone.triggerError @ ng_zone.js:278 
onHandleError @ ng_zone.js:257 
ZoneDelegate.handleError @ zone.js:236 
Zone.runTask @ zone.js:157 
ZoneTask.invoke @ zone.js:335 
Subscriber.js:227 Uncaught TypeError: Cannot read property 'open' of undefined 
    at Function.SnackBar.showSnackBar (snack-bar.ts:13) 
    at SafeSubscriber._next (edit.component.ts:78) 
    at SafeSubscriber.__tryOrUnsub (Subscriber.js:223) 
    at SafeSubscriber.next (Subscriber.js:172) 
    at Subscriber._next (Subscriber.js:125) 
    at Subscriber.next (Subscriber.js:89) 
    at CatchSubscriber.Subscriber._next (Subscriber.js:125) 
    at CatchSubscriber.Subscriber.next (Subscriber.js:89) 
    at MapSubscriber._next (map.js:83) 
    at MapSubscriber.Subscriber.next (Subscriber.js:89) 
SnackBar.showSnackBar @ snack-bar.ts:13 
(anonymous) @ edit.component.ts:78 
SafeSubscriber.__tryOrUnsub @ Subscriber.js:223 
SafeSubscriber.next @ Subscriber.js:172 
Subscriber._next @ Subscriber.js:125 
Subscriber.next @ Subscriber.js:89 
Subscriber._next @ Subscriber.js:125 
Subscriber.next @ Subscriber.js:89 
MapSubscriber._next @ map.js:83 
Subscriber.next @ Subscriber.js:89 
onLoad @ xhr_backend.js:72 
ZoneDelegate.invokeTask @ zone.js:265 
onInvokeTask @ ng_zone.js:227 
ZoneDelegate.invokeTask @ zone.js:264 
Zone.runTask @ zone.js:154 
ZoneTask.invoke @ zone.js:335 

, что я делаю не так, что я понял?

ответ

1

Если его статической функции вы можете использовать только статические членов «это»

0

Вы можете создать статические методы в классе, а затем импортировать их по имени класса.

Пример:

export class AStaticServiceClass { 

    static doStuff(){ 
    return "I'm Static"; 
    } 
} 

и использовать его везде, где вы хотите, как:

this.name = AStaticServiceClass.doStuff(); 

путем импорта класса.

Полный пример plunker: http://plnkr.co/edit/NWRSuaUpzkPEP3gL1DKK?p=preview

+0

я знаю, что) видеть мой код ... – k1882617

+0

@ k1882617 вы можете добавить статический класс метод на вопрос? На самом деле вы можете написать имена классов поверх функций, которые вы предоставили? Очень сложно понять, какой класс – echonax

Смежные вопросы