2016-10-19 7 views
2

Есть ли способ получить идентификатор узла инкапсуляции, который предоставляется компоненту?Можете ли вы получить идентификатор узла инкапсуляции компонента?

Если у вас есть компонент, который использует ViewEncapsulation.Emulated элемент в DOM будет иметь имя атрибута что-то вроде _nghost-par-2. Which, это уникальный идентификатор учитывая компоненту инкапсулировать связанные стили.

Как вы получаете этот идентификатор как часть конструктора компонента?

Что-то эффект:

@Component({ 
    hostId:string; 
    ... 
}) 
export class myComponent implements OnInit { 
    constructor(host:Host) { 
    this.hostId = host.id; 
    } 
    ... 
} 

ответ

2

Этот идентификатор состоит из следующих частей:

_nghost - par -  2 
    |   |   | 
static  APP_ID _nextCompTypeId 

APP_ID является просто маркер из @ угловой/ядра

Если вы ред, чтобы избежать случайно сгенерированного значения, которое будет использоваться в качестве идентификатора приложения, вы можете обеспечить собственное значение через поставщик DI настраиваемого корневой Инжектор с помощью этого маркера

_nextCompTypeId генерируются внутри структуры, в рамках частного класса ViewUtils ,

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

export class MyComponent { 
    id: string; 
    constructor(@Inject(APP_ID) appId: string, vcRef: ViewContainerRef) { 
    this.id = `${appId}-${vcRef.injector['_view'].viewUtils._nextCompTypeId - 1}`; 
    } 
} 

Другой способ получить его из attributes через elementRef

+0

Первый раз я вижу строку будучи построить таким образом. Это другое. Кроме того, если кто-то еще смотрит на это, не забудьте добавить APP_ID и Inject в ваш @ угловой/основной импорт. – Brenton

+0

Еще одна вещь: «_nghost» - это статическая часть корневого компонента. «_content» - для каждого подкомпонента. Подробнее здесь: http://blog.thoughtram.io/angular/2015/06/29/shadow-dom-strategies-in-angular2.html – Brenton

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