- Laravel 8 Blade templates
- Vue 2 application mounted inside the Blade file
- Bootstrap 5 modal
- jquery
У меня есть сторонний веб-URL-адрес в чате в среде, основанной на VUE, которая делает свой пользовательский интерфейс в . В зависимости от взаимодействия с пользователем, я хочу перемещать то же самое либо в обычный, либо в модал начальной загрузки - без перезагрузки его содержания каждый раз. < /P>
Однако всякий раз, когда я называю AppendChild (this.iframe) для перемещения между двумя контейнерами, состояние Iframe сбрасывает и его перезагружает. Blade + Vue App Container
Код: Выделить всё
class="modal fade"
id="chatModal"
tabindex="-1"
aria-labelledby="chatModalLabel"
aria-hidden="true">
Assistant
Код: Выделить всё
window.app = Vue.createApp({
data() {
return {
showInAssistantModal: false,
iframe: null
};
},
components: { AiAssistantComponent },
methods: {
closeAssistantModal() {
const modalEl = document.getElementById("chatModal");
const modal = bootstrap.Modal.getInstance(modalEl) || new bootstrap.Modal(modalEl);
modal.hide();
this.showInAssistantModal = false;
this.$refs.aiAssistantTab.showInAssistantModal = false;
// Move the iframe back to the tab container
const target = this.showInAssistantModal
? this.$refs.chatModalContainer
: document.getElementById("chatAppContainer");
target.appendChild(this.iframe);
}
}
}).mount("#app");
Код: Выделить всё
const AiAssistantComponent = {
name: "ai-assistant-component",
template: `
Toggle Assistant
`,
data() {
return {
showInAssistantModal: false,
iframe: null,
currentChatId: null,
link: ""
};
},
async created() {
this.currentChatId = await this.fetchAssistantData();
this.link = this.currentChatId
? `https://baseUrl/chat/${this.currentChatId}?navbar=false&iframe=true`
: `https://baseUrl/?agent=${assistant_tab_agent_id}&iframe=true&navbar=false`;
// Create and mount the iframe for the first time
this.iframe = document.createElement("iframe");
Object.assign(this.iframe, {
id: "iframe-element",
src: this.link,
width: "100%",
style: "border:none;min-height:400px;"
});
window.app.iframe = this.iframe;
this.$refs.chatAppContainer.appendChild(this.iframe);
},
methods: {
moveIframe() {
this.showInAssistantModal = !this.showInAssistantModal;
window.app.showInAssistantModal = this.showInAssistantModal;
// Determine the new container
const target = this.showInAssistantModal
? document.getElementById("chatModalContainer")
: this.$refs.chatAppContainer;
// Show or hide the modal
const modalEl = document.getElementById("chatModal");
const modal = new bootstrap.Modal(modalEl, { backdrop: false });
if (this.showInAssistantModal) {
modal.show();
// Make the modal draggable
$("#chatModal .modal-dialog").draggable({ handle: ".modal-content", scroll: false });
} else {
// If closing, use the root method to handle cleanup
window.app.closeAssistantModal();
}
// **This is where the iframe reloads...**
target.appendChild(this.iframe);
}
}
};
Когда я нажимаю ассистенту переключения, существующий должен просто переехать между:
Нормальный контейнер вкладок (#chatappcontainer) и
modal bootptrap modal (#ChatMoDANER). /> Нет перезагрузки или сброса состояния контента. Существующий элемент между двумя разными контейнерами без запуска перезагрузки? Есть ли способ в JavaScript или VUE «возместить» узел iframe в DOM, чтобы он сохранял свое внутреннее состояние? Любые указатели или альтернативные подходы были бы очень оценены!
Подробнее здесь: https://stackoverflow.com/questions/796 ... ng-its-con
Мобильная версия