会议预约通用弹出窗设计

会议预约通用弹出窗设计

突发奇想,然后参照一个同事设计了这样一个通用的弹出提示框。这个跟系统自带的窗口,差别还是很大的。跟同事的设计的,又有区别。同事设计的,因为主要内容区域全部都是html写的,不太便于扩展,而且将按钮的事件绑定到了全局的函数中,不利于组件的封装性。所以,就用了半天时间,自己参照设计图,编写了这样一个相对通用的提示框。

过程中遇到的主要问题:

  • 窗体内的子组件设计:
    最开始的时候,使用label组件,结果发现这个组件的内容,只能在一行显示,如果超了之后,那么超出的,自动就隐藏了。后来才想到使用panel这样的组件。
  • 主体内容的样式,设定。

难度主要在于,区分 style bodyStyle这两种样式的作用。反正,我也不知道,就两个都试试。另外,如果样式设定了,没有起作用,有两种可能,一种是上面的元素覆盖到下面的元素的样式,导致下面的样式显示不出来。另外一种可能,由于css的样式的优先级,可能被系统默认的,给覆盖了。这些都需要打开浏览器的控制台,去研究。另外,在定义元素的时候的style的样式,优先级很高,自己在sass里面定义的内容,干不过在js代码里面定义的style的样式,解决办法,只好移动到sass中,降低优先级。

另外,在这个过程中,发现一个好用的定义样式的方式。就是sass,先找大的范围,缩小范围后,然后在用定义。这样的好处是,不用改写到别人的样式。这里面有个好用的方法,起外号,cls样式(虽然现在没有用过,以后自定义样式肯定用得到)。

  • 按钮的设计

直接套用了之前的按钮设计。灵活得使用了空的compenent来自定义属性。

  • 另外一个,自己为自己设计的小麻烦。bind hidden的时候,结果总是写错了,写成了rightHandler,结果写隐藏,总是隐藏不到。

说明

如果只要一个按钮,随意隐藏一个按钮(之前并不是,只能优先隐藏右边的。现在左右两边都增加了一个配重块,如果隐藏一个按钮,另外一侧的component就显示出来了)。如果两个按钮,就不用隐藏。

/******************
 * 2019年1月21日
 * 会议预约通用弹出提示框
 ******************/
Ext.define('DesktopOrder.view.meetingorder.CommonMsgWin', {
    extend: 'Ext.window.Window',
    xtype:"commonmsgwin",
    height: 500,
    width:400,
    padding:'0 30',
    modal:true,
    closable:false,
    layout:'vbox',
    resizable :false,
    buttonAlign :'center',
    vmData:null,
    viewModel:{
        data:{
            icon:'<img src="./resources/meetingorder/images/meetingsubmit/reject.png" alt="">',
            title:'确定取消会议?',
            message:'取消非当天会议不扣分,取消当天会议您的评分会下降',
            btnLeft:'取消',
            btnRight:'确定',
            hiddenLeft:false,
            hiddenRight:false
        }
    },
    style: {
        borderRadius:'10px',
        border:0
    },
    constructor:function(config){//后执行
		var me = this;
        me.superclass.constructor.call(me, config); 
    },
    initComponent:function(){//先执行
        var me = this;
        me.applyCommonMsgWin();
        me.callParent();
        if(me.vmData){
            me.getViewModel().setData(me.vmData);
        }
    },
    applyCommonMsgWin:function(){
        var me=this;
        Ext.apply(me,{
            dockedItems: [{
                xtype: 'toolbar',
                dock: 'bottom',
                ui: 'footer',
                height:100,
                defaults: {
                    minWidth: 70,
                    scale: 'medium',
                    style: {
                        borderRadius:'20px',
                        border:'solid 1px #d6d6d4',
                        fontSize:'16px',
                        color:'#5c5757',
                    },
                    bodyStyle:{
                        color:'#5c5757'
                    }
                },
                style: {
                    backgroundColor:'transparent'
                },
                items: [{
                    xtype: 'component', flex: 1,
                    style:'border:0;',
                    bind:{
                        hidden:'{!hiddenRight}'
                    },
                },{//左侧
                    xtype: 'button',
                    width:100,
                    height:40,
                    bind:{
                        hidden:'{hiddenLeft}',
                        text:'{btnLeft}'
                    },
                    handler: function () {
                        me.leftHandler();
                    }
                },{
                    xtype: 'component', flex: 1,
                    style:'border:0;'
                },{//右侧
                    xtype: 'button', 
                    margin:'0 0 0 0',
                    width:100,
                    height:40,
                    bind:{
                        hidden:'{hiddenRight}',
                        text:'{btnRight}'
                    },
                    handler: function () {
                        me.rightHandler();
                    }
                },{
                    xtype: 'component', flex: 1,
                    style:'border:0;',
                    bind:{
                        hidden:'{!hiddenLeft}'//这是后来加的,不必刻意隐藏右侧的按钮。
                    },
                }]
            }]
        });
    },
    items:[{
        bind:{
            html:'{icon}',
        },
        width:'100%',
        height:150,
        bodyStyle: {
            textAlign:'center',
        }
    },{
        bind:{
            html:'{title}',
        },
        width:'100%',
        height:50,
        bodyStyle: {
            color:'#26BAEE',
            fontSize:'28px',
            textAlign:'center',
            lineHeight:'50px'
        }
    },{
        bind:{
            html:'{message}',
        },
        width:'100%',
        bodyStyle: {
            color:'#6B6461',
            fontSize:'22px',
            textAlign:'center',
            lineHeight:'42px'
        }
    }],
    leftHandler:function(){
    },
    rightHandler:function(){
    }
});

css样式

使用css样式,确实很舒服。能方便灵活的定义样式。

//注意使用  .x-window 进行了缩小范围操作。这个是很重要的思想。
.x-window{
     //这个是因为color,只有写到这个级别才能起作用,写到style中,居然没有啥用。因为style中的通用样式,干不过下面这个。
    .x-btn-inner-default-medium{
        color: #5c5757;
    }
    //因为后面这个写在style中,一般的sass样式都干不过它,所以只要让它降级,写到sass文件中,才行。
    a.x-btn{
        background-color:#f2f2f2
    }
    //其实用:hover伪类选择器,也是可以的。
    a.x-btn-over{
        background-color:#ddd;
    }
    //这个后面这个,主要是因为.x-btn-pressed的类名干不过下面这个长的,所以才使用这么长的名字。
    .x-btn.x-btn-menu-active.x-btn-default-medium, .x-btn.x-btn-pressed.x-btn-default-medium{
        background-color:#CCCCCC;
    }
}

使用方法

使用两个按钮

var win=Ext.widget({
	xtype:'commonmsgwin',
	vmData:{
	    title:'确定返回?',
	    message:'返回后,数据将不会保存。'
	},
	leftHandler:function(){
	    win.destroy();
	},
	rightHandler:function(){
	    ShineMessageHub.fireEvent("meetingmainhomesetactiveitem",me.setItemIndex);
	    win.destroy();
	}
}).show();

使用一个按钮

var win=Ext.widget({
	xtype:'commonmsgwin',
	vmData:{
	    title:'操作提示',
	    message:'返回后,数据将不会保存。',
	    hiddenLeft:true//隐藏任意一个按钮即可。
	},
	rightHandler:function(){
	    win.destroy();
	}
    });
    if(action.result.code==1){//一般错误提示
	win.getViewModel().setData({message:msg});
	win.show();
    }
    if(action.result.code==2){//时间冲突
	win.getViewModel().setData({message:'时间已冲突,请重新选择。'});
	win.show();
    }

使用两个按钮

var win=Ext.widget({
	xtype:'commonmsgwin',
	vmData:{
	    title:'确定返回?',
	    message:'返回后,数据将不会保存。'
	},
	leftHandler:function(){
	    win.destroy();
	},
	rightHandler:function(){
	    ShineMessageHub.fireEvent("meetingmainhomesetactiveitem",me.setItemIndex);
	    win.destroy();
	}
    }).show();//记得一定要show出来。

在更改默认的rightHandler的值的时候,记得别当成了viewModel了。

使用下面的方式即可。

win.getViewModel().setData({message:'会议已创建成功。',icon:'pass'});
    win.rightHandler=function(){
	ShineMessageHub.fireEvent("meetingorderhomebackpreviouspage");
	win.destroy();
    };
    win.show();