РЕДАКТИРОВАТЬ: это веб-компонент, экспортированный из Angular с использованием Angular Elements, и не является традиционным Angular
Я экспериментирую с Angular Elements и создал компонент NgFor, который загружает файл JSON ниже.
[
{
"id":1,
"name": "star 1",
"image":"https://picsum.photos/id/1059/400/400",
"text":"Text about star 1"
},
{
"id":2,
"name": "star 2",
"image":"https://picsum.photos/id/1060/400/400",
"text":"Text about star 2"
},
{
"id":3,
"name": "star 3",
"image":"https://picsum.photos/id/1061/400/400",
"text":"Text about star 3"
},
{
"id":4,
"name": "star 4",
"image":"https://picsum.photos/id/1062/400/400",
"text":"Text about star 4"
},
{
"id":5,
"name": "star 5",
"image":"https://picsum.photos/id/1063/400/400",
"text":"Text about star 5"
},
{
"id":6,
"name": "star 6",
"image":"https://picsum.photos/id/1064/400/400",
"text":"Text about star 6"
},
{
"id":7,
"name": "star 7",
"image":"https://picsum.photos/id/1065/400/400",
"text":"Text about star 7"
},
{
"id":8,
"name": "star 8",
"image":"https://picsum.photos/id/1066/400/400",
"text":"Text about star 8"
},
{
"id":9,
"name": "star 9",
"image":"https://picsum.photos/id/1067/400/400",
"text":"Text about star 9"
},
{
"id":10,
"name": "star 10",
"image":"https://picsum.photos/id/1068/400/400",
"text":"Text about star 10"
}
]
Это отображает список в браузере
Star1
Star2
Star3
.
.
etc
Для этих элементов есть функция onClick, которая испускает объект через свойство @Output.
Затем у меня есть eventListener в теге сценария в HTML, который прослушивает это излучение и обновляет свойство src в теге img с соответствующим изображением.
Мой вопрос: Я хотел бы создать еще один WebComponent, в который встроен этот eventListener, чтобы я мог просто добавить этот второй компонент в HTML, и тогда они будут общаться друг с другом без необходимости писать eventListener непосредственно в теге скрипта. Мой текущий код.
<name-list />
<img-comp />
<img></img> //not needed if <img-comp> can receive the emitted data
<script src="elementCommunicationWithDom.js"></script>
<script>
init();
function loadJSON(callback) {
var xobj = new XMLHttpRequest();
xobj.overrideMimeType("application/json");
xobj.open('GET', 'data.json', true);
xobj.onreadystatechange = function () {
if (xobj.readyState == 4 && xobj.status == "200") {
callback(xobj.responseText);
}
};
xobj.send(null);
}
function init() {
loadJSON(function (response) {
var obj = JSON.parse(response);
console.log(obj);
let element = document.querySelector('name-list');
element.names = obj; //set the html property names created in @input in Angular to the object
});
}
let element = document.querySelector('name-list');
let img = document.querySelector('img');
// I want to do the below directly within the <img-comp> component
element.addEventListener("onSelectItem", (event) => { //gets the output of @Output which is onSelectItem
img.src = event.detail.image;
console.log(event.detail.image)
})
</script>
Вернувшись в мой компонент Angular для <img-comp>
, у меня есть следующее
Шаблон
<img [src]="imgsrc" />
Составная часть
@Component({
selector: 'app-img-comp',
templateUrl: './img-comp.component.html',
styleUrls: ['./img-comp.component.css']
})
export class ImgCompComponent implements OnInit {
@Input() imgsrc: string;
//This below is incorrect and is what I need I think to make this work
@HostListener('onSelectItem', ['$event'])
OnStarClicked(event) {
this.imgsrc = event.detail.image;
console.log(event.detail.image);
}
Как мне заставить свойство @Hostlistener правильно добавить эквивалентный eventListener, который находится в теге скрипта html?
@Output() onSelectItem: EventEmitter<string> = new EventEmitter<string>();
, а в функции onClick естьthis.onSelectItem.emit(item.value);
- person Bwizard   schedule 03.11.2019