angular 引入 jsPanel4
公司预购的项目中有一个活动窗口的功能,可以拖拽位置,可以改变大小,看着挺有意思,了解了下构成,发现使用的是 jqwidgets 这个框架里的 window,
大致看了下 jqwidgets ,自用的话没事,要是商用,则需要掏钱。。。买来项目二次开发的话,再付费是不可能的,还是得找个能够代替的活动窗口。
找来找去最后看上了 jsPanel:https://jspanel.de/

这个活动窗口做的真不错~
简单的用 js 测试了下,发现支持的东西还挺全的:
import { fabric } from 'fabric';
import { jsPanel } from 'jspanel4';
/**
* 活动窗口
* 可拖拽位置,可拖拽边缘更改大小
* https://jspanel.de/
*/
export class ActivePanel {
data = {
count: Math.random(),
}
timer = null;
constructor(canvas) {
Object.assign(jsPanel.defaults, {
// theme: 'info', // 它的主题颜色与Bootstrap是契合的,如primary、info、success、default等
});
let jp = jsPanel.create({
animateIn: 'jsPanelFadeIn', // 淡入
animateOut: 'jsPanelFadeOut', // 淡出
// autoclose: {
// progressbar: true, // 默认 true ,false 则 background 无效
// time: '6s',
// background: 'linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(0,255,17,1) 100%)'
// }, // 毫秒,面板自动关闭
border: 'thick dashed orange', // 设置边框 1px solid #ddd
borderRadius: '.5rem',
boxShadow: 3, // 0-5
callback: function (panel) {
// console.log(panel);
let self = this;
this.content.innerHTML += `<p>data: ${ this.options.data.count }</p>`;
setTimeout(() => {
self.content.innerHTML += `<p>data: ${ self.options.data.count }</p>`;
},2000);
},
closeOnEscape: true, // esc 按键关闭是否可用
container: 'window', // default window;非 window ,需要元素实体:div.main-content => <div class="main-content"></div>
content: this.getContent, // 可以直接为 string;也可绑定方法 append 添加
// contentAjax: { // 异步获取内容
// contentFetch: { // 异步获取内容
// url: '',
// },
contentOverflow: 'auto', // scroll 等
contentSize: { width: () => window.innerWidth * 0.5, height: '200px' }, // must be object; 或值为 200 300
data: this.data, // Number, String, Array, Object
dragit: {
cursor: 'move',
handles: '.jsPanel-headerlogo, .jsPanel-titlebar, .jsPanel-ftr', // do not use .jsPanel-headerbar
opacity: 0.6,
disableOnMaximized: true,
// disable: true,
},
header: true, // 是否有标题行,false 则无法拖拽移动
headerControls: { size: 'md' }, // must be object
headerTitle: 'my first panel',
id: 'panel',
position: 'center', // left-top
theme: 'crimson',
});
// 禁用后通过 此方法启用拖拽
jp.dragit(false);
this.change();
}
// 用于测试面板传入数据是否是地址 - 结论是是地址,但是需要触发去取值
change() {
this.timer = setTimeout(() => {
clearTimeout(this.timer);
this.data.count = Math.random();
console.log(this.data.count);
// this.change();
}, 1000);
}
getContent() {
let el = document.createElement('p');
el.textContent = 'The function has to include code adding the content to the panel.';
this.content.append(el);
$(el).attr('id', '111');
// q: 页面出现动态添加元素时,添加元素的事件用普通的方法,无法响应。
// a: 普通添加的事件,只是在document.ready时绑定的已有元素事件,所以动态添加的元素,在document.ready时不存在,所以也无法绑定元素事件,无法对事件进行响应。
// $('#111').on('wheel', (e) => {
// console.log(this);
// });
// 解决:是因为这个方法是绑定到动态添加元素的父级以上元素,如果元素发生变化,也都是从上层元素开始找,动态添加的元素也能被重新查找时所发现,所以事件能够响应
$('#panel').on('click', '#111', (e) => {
console.log(this.options.data);
});
}
}
配置未全看完,待续:https://jspanel.de/#options/header
测试引入 angular 项目。

然后直接 import 时,问题来了。。。

试试添加类型声明 @types/jspanel4 :

结果是没找到。
那就只能自己创建声明文件了:(位置任意)

再看 import ,错误是不报了,但是也没法导出对应对象来使用:

只能类似 jquery 的引入,创建一个 declare,再在 angular.json 文件中引入 js 了:



完成!

ts 导入 js 包,声明报错:https://zhuanlan.zhihu.com/p/349595729

浙公网安备 33010602011771号