angular 引入 jsPanel4

公司预购的项目中有一个活动窗口的功能,可以拖拽位置,可以改变大小,看着挺有意思,了解了下构成,发现使用的是 jqwidgets 这个框架里的 window,

https://www.jqwidgets.com/jquery-widgets-demo/demos/jqxwindow/index.htm#demos/jqxwindow/defaultfunctionality.htm

大致看了下 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

posted @ 2022-04-27 14:45  名字不好起啊  阅读(81)  评论(0编辑  收藏  举报