У меня есть список результатов (который уже работает). Как мне вызвать модальный бутстрап и в то же время передать параметр компоненту внутри модального? Я протестировал модальный режим, и модальный режим начальной загрузки можно вызвать вручную.
<template>
<div class = "main">
<ol>
<li
v-bind:key = "searchResult.id"
v-for = "searchResult in searchResults"
@click = "?(searchResult.snippet.resourceId.videoId)"
>
{{ searchResult.snippet.title }}
</li>
</ol>
<b-modal id = "modal-1" title = "BootstrapVue" :hide-footer = "true">
<p class = "my-4"><VideoIFrame /></p>
</b-modal>
</div>
</div>
</template>
<script>
import VideoIFrame from "@/components/VideoIFrame.vue";
export default {
components: {
VideoIFrame
},
data() {
return {
searchResults: []
};
}
};
</script>
Некоторый код сокращен для краткости
Это код компонента
<template>
<div class = "videoWrapper">
<iframe
:src = "iframesrc"
frameborder = "0"
allow = "autoplay; encrypted-media"
allowfullscreen
></iframe>
</div>
</template>
<script>
import { bus } from "../main";
export default {
data() {
return {
iframesrc: null
};
},
created() {
debugger;
bus.$on("iframesrc", data => {
debugger;
this.iframesrc = data;
});
}
};
</script>
@tao, у меня есть еще один компонент VideoPlayList, с помощью которого я его испускаю bus.$emit("iframesrc", "https://www.youtube.com/embed/" + videoId);
Вместо того, чтобы испускать, вы хотите сохранить значение в Vue.observable()
, которое импортируется как в этот список, так и в VideoIFrame.vue
. Если вы добавите содержимое VideoPlayList.vue
в ветвь этой песочницы, я покажу вам, как использовать Vue.observable()
для обмена данными между компонентами.
Хорошо, я добавил VideoPlayList.vue. На самом деле у меня есть другое представление Playlist.vue, в котором используются как компонент VideoPlayList.vue, так и VideoIFrame.vue. Здесь представление Search.vue использует только компонент VideoIFrame.vue.
Не могли бы вы также поделиться ссылкой на форк? У меня его нет (поскольку вы его разветвили - вы не можете редактировать мою песочницу, как я не мог редактировать одну из ваших песочниц). Когда я это делаю, он автоматически создает вилку со случайным URL-адресом. Мне нужна ссылка на ваш форк, чтобы увидеть, что вы добавили.
Хорошо, конечно, это ссылка
Давайте продолжим обсуждение в чате.
Проблема, которую я вижу с тем, что у вас есть, заключается в том, что вы привязываетесь к событию $bus
iframesrc
внутри VideoIFrame
created
. Но VideoIFrame
создается только при открытии модального окна. Таким образом, если автобус выдает iframesrc
, когда модальное окно не открыто, iframesrc
будет undefined
, когда вы его открываете, потому что оно пропустило событие, когда оно было выдано.
Чтобы решить эту проблему, вы должны поместить код, перехватывающий излучение, за пределы модального компонента.
Вы можете просто поместить его в родителя модального окна и передать как prop
компоненту VideoIFrame в шаблоне.
Другие возможные решения, если вы не хотите связывать VideoIFrame с родителем модального окна, — это использовать любое решение для управления состоянием (например, Vuex, Vue.observable()).
Основываясь на вашем первоначальном примере, вот обновление, используя простой магазин (с Vue.observable()
). Суммируя:
$bus
использованиеВот об этом.
Как всегда, используя реквизит. Подробнее об этом можно прочитать здесь https://v2.vuejs.org/v2/guide/components-props.html
Я нашел больше проблем с вашим кодом, так что давайте исправим это.
Нам нужно отправить компонент (videoIframe) с нужным URL-адресом.
<template>
<div class = "main">
<ol>
<li
v-bind:key = "searchResult.id"
v-for = "searchResult in searchResults"
@click = "showModal(`https://example.com/${searchResult.snippet.resourceId.videoId}`)"
>
{{ searchResult.snippet.title }}
</li>
</ol>
<b-modal id = "modal-1" title = "BootstrapVue" v-model = "modalOpen" :hide-footer = "true">
<p class = "my-4"><VideoIFrame :framesrc = "currentURL " /></p>
</b-modal>
</div>
</div>
</template>
<script>
import VideoIFrame from "@/components/VideoIFrame.vue";
export default {
components: {
VideoIFrame
},
data() {
return {
modalOpen: false,
currentURL: '',
searchResults: []
};
},
methods: {
showModal(videoURI){
this.showModal = true;
this.currentURL = videoURI;
}
}
};
</script>
Компонент iframe - должен объявить, что он получает реквизит по имени "iframesrc", а не в объекте данных.
<template>
<div class = "videoWrapper">
<iframe
:src = "iframesrc"
frameborder = "0"
allow = "autoplay; encrypted-media"
allowfullscreen
></iframe>
</div>
</template>
<script>
import { bus } from "../main";
export default {
props: ['iframesrc']
};
</script>
У меня также есть еще один компонент VideoPlayList, который я испускаю с помощью bus.$emit("iframesrc", "https://www.youtube.com/embed/" + videoId);
Теперь я могу вызвать модальное окно с помощью вашего кода. Но модальное окно все еще не может получить значение iframesrc
. Ваш :framesrc = "currentURL"
должен быть :iframesrc = "currentURL "
?
Не могли бы вы также показать, откуда вы звоните
$bus.emit('iframesrc', url)
?