ApplicationDomain中类定义的销毁

本文介绍了如何使用ApplicationDomain管理加载内容中的类定义。通过Loader::load方法可以指定新加载模块中类定义存放的位置。即使卸载加载内容,类定义也会保留。若要卸载类定义,则需销毁其所在ApplicationDomain。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ApplicationDomain是类定义的容器,通过Loader::load(request:URLRequeset,loaderContext:LoaderContext):void方法中的第二个参数来设定新加载进来的模块中类定义存放的位置。

一旦模块加载进来之后,类的定义便被装入到某个ApplicationDomain中,并且这些定义不会因为加载内容的卸载(通过调用Loader::uload()或者Loader::unloadAndStop()方法)而销毁:

import flash.display.Loader;
import flash.net.URLRequest;
import flash.system.LoaderContext;
import flash.events.Event;

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
loader.load(new URLRequest("library.swf"),new LoaderContext(false,ApplicationDomain.currentDomain));
function onComplete(e:Event):void
{
	var mc:mcA = new mcA();
	trace(mc,mc.name)
	loader.unloadAndStop(true);
	var mc2:mcA = new mcA();
	trace(mc2,mc2.name)
}

以上的程序运行正常,说明卸载加载内容后,mcA的类定义依然存在。

如果想要卸载某些类的定义,只能通过销毁其所在的ApplicationDomain,但这同时会销毁该容器中所有的类的定义。

一种有效的方案是为需要卸载的类定义单独配置ApplicationDomain容器。

<template> <div style="border: 1px solid #ccc"> <!-- 工具栏 --> <Toolbar style="border-bottom: 1px solid #ccc" :editor="editor" :default-config="toolbarConfig" /> <!-- 编辑器 --> <Editor v-model="html" style="min-height: 200px; overflow-y: hidden" :default-config="editorConfig" @onChange="onChange" @onCreated="onCreated" /> </div> </template> <script setup> import { Editor, Toolbar } from '@wangeditor/editor-for-vue' import '@wangeditor/editor/dist/css/style.css' import { getToken } from '@/utils/auth' // 定义 props const props = defineProps({ htmlData: { type: String, default: '' }, readOnly: { type: Boolean, default: false } }) const emit = defineEmits(['editorChange']) const editor = ref(null) const html = ref('') const toolbarConfig = ref({}) const editorConfig = ref({ placeholder: '(图片需要手动设置100%,否则为图片原本大小,可能会超出屏幕)请输入内容...', MENU_CONF: {} }) // 监听 htmlData 变化 watch( () => props.htmlData, (val) => { console.log('WangEditLocal中watch的接收的htmlData', val) // 避免不必要的更新 if (val !== html.value) { html.value = val } }, { immediate: true } ) // 配置编辑器 onMounted(() => { // 配置上传图片 editorConfig.value.MENU_CONF.uploadImage = { server: import.meta.env.VITE_APP_BASE_URL + '/common/upload', timeout: 50 * 1000, // 50s fieldName: 'file', meta: { token: getToken() }, metaWithUrl: true, headers: { Authorization: getToken() }, maxFileSize: 20 * 1024 * 1024, // 20M base64LimitSize: 5 * 1024, // insert base64 format, if file's size less than 5kb // 上传之前触发 onBeforeUpload(file) { console.log(123123) return file }, // 上传进度的回调函数 onProgress(progress) { console.log('progress', progress) }, // 单个文件上传成功之后 onSuccess(file, res) { console.log(`${file.name} 上传成功`, res) }, // 单个文件上传失败 - 修复res可能为undefined的问题 onFailed(file, res) { const errorMsg = res?.message || '未知错误' ElMessage.error(`${file.name} 上传失败: ${errorMsg}`) console.log(`${file.name} 上传失败`, res) }, // 上传错误,或者触发 timeout 超时 - 修复err和res的处理 onError(file, err, res) { const errorMsg = err?.message || res?.message || '上传出错' ElMessage.error(`上传出错: ${errorMsg}`) console.log(`${file.name} 上传出错`, err, res) } } // 配置上传视频 editorConfig.value.MENU_CONF.uploadVideo = { server: import.meta.env.VITE_APP_BASE_URL + '/common/upload', fieldName: 'file', maxFileSize: 20 * 1024 * 1024, // 20M maxNumberOfFiles: 3, allowedFileTypes: ['video/*'], meta: { token: getToken() }, metaWithUrl: true, headers: { Accept: 'application/json, text/plain, */*', Authorization: getToken() }, withCredentials: false, timeout: 50 * 1000, onBeforeUpload(file) { return file }, onProgress(progress) { console.log('progress', progress) }, onSuccess(file, res) { console.log(`${file.name} 上传成功`, res) }, // 单个文件上传失败 - 修复res可能为undefined的问题 onFailed(file, res) { const errorMsg = res?.message || '未知错误' ElMessage.error(`${file.name} 上传失败: ${errorMsg}`) console.log(`${file.name} 上传失败`, res) }, // 上传错误,或者触发 timeout 超时 - 修复err和res的处理 onError(file, err, res) { const errorMsg = err?.message || res?.message || '上传出错' ElMessage.error(`上传出错: ${errorMsg}`) console.log(`${file.name} 上传出错`, err, res) } } // 是否只读 editorConfig.value.readOnly = props.readOnly }) // 编辑器创建时的回调 const onCreated = (editorInstance) => { editor.value = Object.seal(editorInstance) } // 编辑器内容变化时的回调 - 优化字符串处理逻辑 const onChange = (editorInstance) => { let editorString = editorInstance.getHtml() // 优化视频居中处理逻辑 if (editorString.includes('data-w-e-type="video"')) { editorString = editorString.replace( /<div data-w-e-type="video"/g, '<div data-w-e-type="video" style="text-align: center;"' ) } emit('editorChange', editorString) } // 组件卸载销毁编辑器 onBeforeUnmount(() => { if (editor.value && typeof editor.value.destroy === 'function') { editor.value.destroy() editor.value = null // 清理引用 } }) </script> 帮我查看问题是什么 我上传图片总是说无配置地址
最新发布
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值