#angular #pug
#angular #pug
Вопрос:
Я пишу приложение Angular2 с использованием pug. У меня есть две версии шаблона, мой HTML работает, но мой Pug не может кто-нибудь увидеть, чего мне не хватает…
// HTML
<div #main>
<h1>Test Html</h1>
</div>
//PUG
.app( #main )
h1 My Angular App
// Component
import { ElementRef, Component, AfterViewInit, ViewChild } from '@angular/core';
declare var $:JQueryStatic;
@Component({
selector: 'my-app',
// template: String(require('./app.component.html'))
template: String(require('./app.component.pug'))
})
export class AppComponent implements AfterViewInit{
@ViewChild('main') el:ElementRef;
ngAfterViewInit() {
$(this.el.nativeElement).css('background-color', 'red');
}
}
Ошибка, которую я получаю для pug, такова…
Unhandled Promise rejection: Template parse errors:
Unexpected character "EOF" (Do you have an unescaped "{" in your template? Use "{{ '{' }}") to escape it.) (" #mainu003Eu003Ch1u003EMy Angular Appu003Cu002Fh1u003Eu003Cu002Fdivu003E";;return pug_html;}[ERROR ->]"): AppComponent@0:221
Invalid ICU message. Missing '}'. (" #mainu003Eu003Ch1u003EMy Angular Appu003Cu002Fh1u003Eu003Cu002Fdivu003E";;return pug_html;}[ERROR ->]"): AppComponent@0:221 ; Zone: <root> ; Task: Promise.then ; Value: Error: Template parse errors:(…) Error: Template parse errors:
Unexpected character "EOF" (Do you have an unescaped "{" in your template? Use "{{ '{' }}") to escape it.) (" #mainu003Eu003Ch1u003EMy Angular Appu003Cu002Fh1u003Eu003Cu002Fdivu003E";;return pug_html;}[ERROR ->]"): AppComponent@0:221
Invalid ICU message. Missing '}'. (" #mainu003Eu003Ch1u003EMy Angular Appu003Cu002Fh1u003Eu003Cu002Fdivu003E";;return pug_html;}[ERROR ->]"): AppComponent@0:221
Ответ №1:
Я не знаю, что такое pug или как он работает, но если он во время выполнения добавляет HTML в DOM, он не будет работать. Angular не обрабатывает HTML в DOM, он обрабатывает только свои шаблоны. [propName]="..."
, (eventName)="..."
, {{}}
или селекторы компонентов и директив просто игнорируются Angular2, если они находятся где-либо еще, кроме статически добавленных в шаблон.
@ViewChild()
Совместное использование с jQuery кажется довольно бессмысленным. @ViewChild()
позволяет Angular2 выполнять доступ к DOM и избегать прямого доступа к DOM из вашего пользовательского кода. Если вы используете jQuery, весь смысл избегать прямого доступа к DOM отключен.
Вы можете просто ввести ElementRef
constructor(private el:ElementRef) { }
чтобы получить ссылку на хост-элемент текущего компонента и начать с jQuery оттуда.
Комментарии:
1. Pug — это прекомпилятор для HTML, поэтому HTML работает, но pug не понимает pug не понимает
<div #main>
(или в случае pugdiv(#main)
). Часть конструктора не отвечает на вопрос. Мне нужно получить доступ к Jquery в элементе, потому что я внедряю библиотеку jquery. Спасибо за попытку помочь!2. Когда и где он компилируется? На сервере или на клиенте после его загрузки в браузер? Вы можете получить доступ к элементу внутри шаблона из
ElementRef
того, что вы получаете в конструкторе.$(this.el.nativeElement.querySelector('div'))
или подобное.3. Это проблема с тем, как pug переносит #main, не имеющую ничего общего со стороной ng2. Если только я не могу использовать ViewChild без
#main
синтаксиса. Извините за путаницу4. Angular2 распознает
#someName
только тогда, когда он добавлен статически в шаблон компонента. Когда он добавляется в DOM, Angular вообще не распознает его. Если вы добавите его в шаблон components, он также не будет добавлен в DOM. Angular2 обрабатывает его шаблон компонентов перед добавлением результата в DOM. Привязка Angular и подобные вещи никогда не попадают в DOM.5. На данный момент я могу использовать конструктор, но в конечном итоге мне понадобится другой, поэтому мне придется проявить творческий подход или найти кого-то, кто знает, как правильно escape в pug
Ответ №2:
Pug / Jade не допускает этого. Однако вы можете записать обычный HTML-код в свой файл .pug, чтобы получить поведение, которое вы ищете. Ваш pug будет выглядеть так:
//PUG
<div #main class="app">
h1 My Angular App
</div>
Ответ №3:
Добавьте doctype html
в начало файла pug.