Я хочу передать несколько параметров структурной директиве, но то, что работало в Angular2, похоже, больше не работает в Angular5
Вот мой blah
компонент, который содержит аккордеон:
@Component(
selector: "blah-scene",
// language=HTML
template: """
<div>
Blah Test Page
<accordion>
<div *accordionItem>
item1
</div>
<div *accordionItem>
item2
</div>
</accordion>
</div>
""",
directives: const [
Accordion,
AccordionItemDirective
]
)
class BlahScene implements AfterContentInit, OnDestroy {
...
}
Аккордеон определяется следующим образом:
@Component(
selector: 'accordion',
// language=HTML
template: """
<ul class="accordion"
[id]="id"
[attr.data-slide-speed]="slideSpeed"
[attr.data-multi-expand]="multiExpand"
[attr.data-allow-all-closed]="allowAllClosed">
<ng-content></ng-content>
</ul>
""",
styles: const ["""
.overflow-hidden {
overflow: hidden;
}
"""
],
)
class Accordion implements AfterContentInit, OnDestroy, OnChanges {
@ContentChildren(AccordionItemDirective)
List<AccordionItemDirective> items;
...
}
Я ожидаю, что эти два элемента div, отмеченные *accordionItem
, будут отображаться как элементы аккордеона, которые он делает.
AccordionItem:
@Component(
selector: "li",
template: """
<a
*ngIf="visible"
class="accordion-title"
[attr.did]="title"
(click)='onClickTitle(title)'>
{{title?.toUpperCase()}}
<img
src="{{expandButtonPath()}}"
class="expand-navbar"
[class.disabled]='!allowClose && active'>
</a>
<div
class="accordion-content no-padding"
[class.hidden]='!active'
[class.overflow-hidden]="hideScrollBars"
[class.overflow-auto]="!hideScrollBars"
data-tab-content>
<template
[ngIf]="renderAccordionItemContent && visible"
[ngTemplateOutlet]="template">
</template>
</div>
""",
styles: const ["""
...
"""],
directives: const [
NgTemplateOutlet,
coreDirectives
]
)
class AccordionItem implements AfterContentInit, OnDestroy {
TemplateRef template;
...
}
А затем AccordionItemDirective
, который создает AccordionItem и добавляет его в DOM:
@Directive(selector: '[accordionItem]')
class AccordionItemDirective implements AfterContentInit {
final ViewContainerRef vcRef;
final TemplateRef template;
AccordionItemDirective(this.vcRef, this.template);
AccordionItem accordionItem;
ComponentRef componentRef;
String accordionId;
@override
ngAfterContentInit() async {
template.createEmbeddedView();
final ComponentRef<AccordionItem> component =
vcRef.createComponent(accordionItemTemplate.AccordionItemNgFactory);
accordionItem = component.instance;
accordionItem
..template = template
..active = _accordionItemActive
..title = accordionItemTitle
..accordionId = accordionId;
}
...
До этого все работает нормально, AccordionItems создаются и вставляютсякак li
внутри аккордеона
![enter image description here](https://i.stack.imgur.com/4yhTW.png)
Теперь я хочу передать параметры, чтобы я мог установить заголовок, идентификатор и некоторые другие свойства этогоaccordionItem В accordionItemDirective я добавляю несколько входных данных:
@Input("accordionItemId") String accordionItemId = "";
bool _accordionItemActive = false;
@Input("accordionItemTitle")
String accordionItemTitle = "Missing Title";
Ожидается, что это сработает:
<accordion>
<div *accordionItem [accordionItemTitle]="'Title1'">
item1
</div>
<div *accordionItem>
item2
</div>
</accordion>
Я получаю эту ошибку:
lib / component/test/blah-scene.dart: ParseErrorLevel.FATAL: Невозможно привязать к 'accordionItemTitle ', поскольку это не известное нативное свойство или известная директива.Пожалуйста, исправьте опечатку или добавьте в список директив.
Попытка без квадратных скобок:
<accordion>
<div *accordionItem accordionItemTitle="'Title1'">
item1
</div>
<div *accordionItem>
item2
</div>
</accordion>
она компилируется, но ничего не происходит.
Я пытаюсьперехватить ввод, но мои log.fines не печатаются вообще
@Input("accordionItemTitle")
set accordionItemTitle(String title) {
log.fine(title);
}
String get accordionItemTitle {
return "Missing Title [...]";
}
В Angular2 это работало:
<accordion>
<div *accordionItem="accordionItemTitle: 'Title1' ">
item1
</div>
<div *accordionItem>
item2
</div>
</accordion>
, но это тоже жалуется:
ParseErrorLevel.FATAL: Невозможно связать с 'accordionItemAccordionItemTitle', так как он не является вводом какой-либо связанной директивы.Пожалуйста, проверьте правильность написания и то, что предполагаемая директива включена в список директив компонента хоста
Как правильно передать параметры в структурную директиву?