2016-10-25 10 views
19

У меня есть постоянные файл constants.ts:Как получить доступ к константе в компоненте Angular 2 и сервисе?

export const C0NST = "constant"; 

я получить доступ к нему в службу some.service.ts так:

import { C0NST } from './constants'; 

console.log(C0NST); // "constant" 

Однако, когда я к нему доступ в шаблон компонента:

some.component.ts:

import { C0NST } from './constants'; 

some.component.html:

{{ C0NST }} <!-- Outputs nothing --> 

Однако определение члена в классе компонента работы:

some.component.ts

public const constant = C0NST; 

some.component.html

{{ constant }} <!-- constant --> 

Я не понимаю, почему я был в состоянии получить доступ к импортирован постоянным непосредственно в классе обслуживания, но не в компоненте шаблона, даже если я импортировать его в классе компонента.

ответ

21

В Angular2, шаблон может только поля доступа и методы класса компонента. Все остальное - вне пределов. Сюда относятся вещи, которые видны классу компонентов.

Путь, чтобы обойти это, иметь поле внутри компонента, которое просто ссылается на константу и использует это вместо этого.


Это одно ограничение дизайна, но, возможно, вам следует, что о том, почему вам нужно постоянное в шаблоне, в первую очередь. Обычно эти вещи используются самими компонентами или услугами, но не шаблоном.

+0

Спасибо, Horia. У меня есть список URL-адресов GIF, которые мне нужны для источника из Giphy, поэтому я сохраняю URL-адреса в файле констант. Я намерен использовать их во всем приложении через компоненты. Что по тебе лучше? –

+1

@KabirRoy Это похоже на приличную вещь, которую нужно делать на самом деле. Если у вас относительно небольшое количество изображений, вы можете фактически создать для них компоненты и использовать URL-адрес гиперссылки непосредственно в источнике (например, вы бы делали для актива, предоставленного вашим приложением). Но это звучит как хороший подход, независимо. –

8

Объем привязок шаблона Angular2 является экземпляром компонента. Только то, что доступно там, может быть использовано в привязках.

Вы можете сделать его доступным как

class MyComponent { 
    myConst = CONST; 
} 
{{myConst}} 
+0

Благодаря человеку, который, как я в настоящее время доступа к нему. :) –

1

Вы можете создать BaseComponent, где вы должны создать свои постоянные экземпляры, а затем вы можете создать свой FooComponent, который расширяет BaseComponent, и вы можете использовать свои константы.

2

Поскольку в шаблоне компонента вы можете использовать только атрибуты класса Component, вы не можете напрямую использовать внешние константы (или внешние переменные).

Самый элегантный способ, который я нашел до сих пор является следующее:

import { MY_CONSTANT } from '../constants'; 

@Component({ 
    // ... 
}) 
export class MyTestComponent implements OnInit { 

    readonly MY_CONSTANT = MY_CONSTANT; 

    // ... 
} 

, которые в основном просто создает новый атрибут MY_CONSTANT внутри класса компонента. Используя readonly, мы не можем изменить новый атрибут.

Это, в шаблоне вы можете использовать:

{{ MY_CONSTANT }}