ht框架定义class类;ht.Default.def从ht类继承派生类;ht-ui中组件API设置图标json,可利用Drawable重写draw集合通过新创建ht.Node对象过渡,来做数据绑定变

HT for web Class: Drawable

HT for web Class: ImageDrawable

HT UI 定义类手册

序列化手册 - HT for Web

渲染元素中实例化的UI组件,并且调用API置图标json,如果图标json有做过据绑绑定,能对其动态赋值吗?实际测试发现这样通常方式并不起效果。

JavaScript
//以下操作:
myview.setIconDrawable(new ht.ui.drawable.ImageDrawable('symbols/admin/AiotOS/base/processCircle.json'));
//效果等同于:
myview.setIcon('symbols/admin/AiotOS/base/processCircle.json')
//如果有设置setIcon(),那么setIconDrawable()就会失效不起作用(被重写覆盖掉了?)

JavaScript
var myview = new ht.ui.Button();
myview.setIconHeight(250)
myview.setIconWidth(400)

function MyDrawable(url){//构造函数调用基类需传入this,同时注意实例化时是否有构造参数的传入!
    MyDrawable.superClass.constructor.call(this,url);    
}

ht.Default.def(MyDrawable, ht.ui.drawable.ImageDrawable , {
    draw: function(x, y, width, height, data, view, dom) {
        let self = this;//成员函数调用基类方法,也需传入this
        MyDrawable.superClass.draw.call(self,x ,y, width, height, data, view, dom);
        console.error(data)    //打印基本都是null
        // var g = view.getRootContext(dom);
        // g.beginPath();
        // g.rect(x, y, width, height);
        // g.fillStyle = 'red';
        // g.fill();
    }
});
//注意这里实例化构造传入了参数,ImageDrawable(image, stretch, colorTint, rect)原本有4个可以传参!
myview.setIconDrawable(new MyDrawable("symbols/admin/AiotOS/base/processCircle.json"));

【重要】组态icon图标,iconfont、fontawesome、SVG图片可以在组态assets资源目录中右键转换成图纸或者图标,并且自动化保存到图标目录下同样命名的文件夹内的步骤;data.a()、data.ca(),带前缀和不带前缀的属性获取及设置方法!

示例:实际使用drawable的场景(table条纹表格行背景颜色):

JavaScript
//设置条纹方式1:
table.setRowBackgroundDrawable(new ht.ui.drawable.StripedRowBackgroundDrawable([nodeData.ca('stripeColors')[1], nodeData.ca('stripeColors')[0]]));

//设置条纹方式2(不建议,这样失去了api设置的效果比如划过的行颜色)
// table.drawRowBackground = function(drawable, x, y, width, height, data) {
//     var g = cache.table.getRootContext();
//     if (cache.table.isSelected(data)) {
//         g.fillStyle = nodeData.ca('rowBackground')[0];
//     } else if (cache.table.getRowIndex(data) % 2 === 0) {
//         g.fillStyle = nodeData.ca('stripeColors')[1];
//     } else {
//         g.fillStyle = nodeData.ca('stripeColors')[0];
//     }
//     g.beginPath();
//     g.rect(x, y, width, height);
//     g.fill();
// };

要起效果,可以通过构建中间对象ht.Node,然后在重载的draw函数中传入到data变量中具体如下:

渲染元素实例化内示例:

JavaScript
let nodeData = data;
if (!cache.obj) {
    function init() {
    
        //----------------------------------------------------------
        
        var myview = new ht.ui.Button();
        myview.setIconHeight(250)
        myview.setIconWidth(400)

        function MyDrawable(url){//构造函数调用基类需传入this,同时注意实例化时是否有构造参数的传入!
            MyDrawable.superClass.constructor.call(this,url);    
        }

        ht.Default.def(MyDrawable, ht.ui.drawable.ImageDrawable , {
            draw: function(x, y, width, height, data, view, dom) {
                let self = this;//成员函数调用基类方法,也需传入this
                /*通过创建Node实例来中间过渡,作为参数传给基类的draw方法!*/
                let mydata = new ht.Node()
                
                /*前面通过构造函数传入到MyDrawable,
                这里通过this和成员方法获得传入的图标URL字符串*/
                mydata.setImage(self.getImage())
                
                /*开始调用属性,对数据绑定的变量来动态赋值!!!*/
                mydata.a('text','hi iotos!')
                mydata.a('borderColor','green')
                MyDrawable.superClass.draw.call(self,x ,y, width, height, mydata, view, dom);
            }
        });
        
        //注意这里实例化构造传入了参数,ImageDrawable(image, stretch, colorTint, rect)原本有4个可以传参!
        myview.setIconDrawable(new MyDrawable('symbols/admin/AiotOS/base/processCurve.json'));
        
        //----------------------------------------------------------
        
        return myview;
    }

    var obj = cache.obj = init()
    obj.layoutHTML = function () {
        gv.layoutHTML(data, obj, false);
    }
}

return cache.obj;

渲染元素实例化内实例:

JavaScript
//方式一:通过ImageDrawable结合染色,来实现对“部分”(不是所有的都能被染色)的图标颜色改变
// textField.setIconDrawable(new ht.ui.drawable.ImageDrawable(autoCompleteIconPath(data,'iconPath'),'centerUniform',data.ca('iconColor')));

/*方式二:iconfont导入的矢量图标,都有做icon-background数据绑定属性暴露,动态赋值,这里不同的
传入的图标根据各自具体的暴露的数据绑定来自行调用属性赋值!*/
let iconPath = autoCompleteIconPath(data,'iconPath'),
    iconColor = data.ca('iconColor');
function MyDrawable(url){//构造函数调用基类需传入this,同时注意实例化时是否有构造参数的传入!
    MyDrawable.superClass.constructor.call(this,url);    
}
ht.Default.def(MyDrawable, ht.ui.drawable.ImageDrawable , {
    draw: function(x, y, width, height, data, view, dom) {
        let self = this;//成员函数调用基类方法,也需传入this
        let mydata = new ht.Node()
        mydata.setImage(self.getImage())
        mydata.a('icon-background', iconColor)
        MyDrawable.superClass.draw.call(self,x ,y, width, height, mydata, view, dom);
    }
});
//注意这里实例化构造传入了参数,ImageDrawable(image, stretch, colorTint, rect)原本有4个可以传参!
textField.setIconDrawable(new MyDrawable(iconPath));

【重要】组态icon图标,iconfont、fontawesome、SVG图片可以在组态assets资源目录中右键转换成图纸或者图标,并且自动化保存到图标目录下同样命名的文件夹内的步骤;data.a()、data.ca(),带前缀和不带前缀的属性获取及设置方法!

封装后的ImageDrawable派生类,并且通过构造函数动态传入任意数量的数据绑定变量与值的键值对

JavaScript
//------------------------iotosCommon.js中封装类的定义--------------------------------
//构造函数除了传入关键的图标url,还要传入自定义的key-value,任意数量的数据绑定变量字段
function DatabindingsImageDrawable(url, attrsValues = {
    'icon-background': 'rgb(55,125,255)',
    'text': 'text'
}) { //构造函数调用基类需传入this,同时注意实例化时是否有构造参数的传入!
    DatabindingsImageDrawable.superClass.constructor.call(this, url);
    this.attrsValues = attrsValues;//js对象加任意属性,供给类的成员方法访问很简单,直接.xxx=yyy赋值即可!
}

/*注意,参数可以是字符串也可以直接是类对象。只是如果用字符串,则会将类名自动注册到HT的classMap中,
一般使用函数(构造函数)即可;如果不是类字符串名而是类对象DatabindingsImageDrawable,
那么在其他地方使用new DatabindingsImageDrawable()创建对象会无法识别,只能在定义的地方使用!
https://www.hightopo.com/guide/doc/ht.Default.html#.def*/
ht.Default.def("DatabindingsImageDrawable", ht.ui.drawable.ImageDrawable, {
    draw: function(x, y, width, height, data, view, dom) {
        let self = this; //成员函数调用基类方法,也需传入this
        /*通过创建Node实例来中间过渡,作为参数传给基类的draw方法!*/
        let mydata = new ht.Node()

        /*前面通过构造函数传入到DatabindingsImageDrawable,再通过this和成员方法
        获得传入的图标URL字符串, 以及遍历传参key-value对数据绑定的变量来动态赋值!*/
        mydata.setImage(self.getImage())
        for(attrItem in self.attrsValues){//使用构造函数中对当前类的自定义属性定义赋值
            mydata.a(attrItem, self.attrsValues[attrItem]);
        }
        // /*开始调用属性,对数据绑定的变量来动态赋值!!!*/
        // mydata.a('text', 'hi iotos!')
        // mydata.a('borderColor', 'green')

        DatabindingsImageDrawable.superClass.draw.call(self, x, y, width, height, mydata, view, dom);
    }
});
//-------------------------------------------------------------------

//-----------------------其他js中调用使用-------------------------------------
let objtmp = new ht.ui.LinkButton();
//方式一:由固定图标写死传入:
//objtmp.setIcon('symbols/demo/AiotOS/icons/light/anchor.json')
//方式二:动态图标数据绑定赋值:
defineClass_DatabindingsImageDrawable();
objtmp.setHoverIconDrawable(new DatabindingsImageDrawable('symbols/demo/AiotOS/icons/light/anchor.json',{
    'icon-background': 'yellow'
}));

对于可以设置背景background属性的,一般都对应可以设置backgroundDrawable,并且传入ImageDrawable对象,此时就可以很好地利用图元节点设置任何矢量图标并动态变量属性设置!对颜色background可配置的区域如何设置圆角radius

【附】字符串形式定义类名称的自定义派生类实例:

HT for web Class: DropDownTemplate

 

JavaScript
if (!cache.obj) {
    function init() {

        importCssJs.js('custom/libs/leaflet/leaflet/leaflet.js');
        importCssJs.css('custom/libs/leaflet/leaflet/leaflet.css');

        mapPicker = new ht.ui.ComboBox();
        mapPicker.setDropDownTemplate(ht.ui.MapDropDown);
        return mapPicker;
    }

    var obj = cache.obj = init()
    
    obj.layoutHTML = function () {
        gv.layoutHTML(data, obj, runningMode());
    }
}

return cache.obj;

JavaScript
function registerHtCommonImage() {
    //……
    
    //自定义派生类
    ht.ui.MapDropDown = function() {}
    ht.Default.def('ht.ui.MapDropDown', ht.ui.DropDownTemplate, {
        initDropDownView: function(master, datas, value) {
            var self = this,
                htmlView = new ht.ui.HtmlView(),
                mapDiv = self._mapDiv = document.createElement("div"),
                map = self._map = L.map(mapDiv, {
                    zoomAnimation: false,
                    trackResize: false
                }).setView([39.9123, 116.3913], 15);
            mapDiv.style.width = '100%';
            mapDiv.style.height = '100%';
            // mapDiv.style.boxShadow = master.getBoxShadow();
            L.tileLayer('http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}', {
                attribution: 'www.aiotos.net',
                maxZoom: 18,
                minZoom: 3
            }).addTo(map);
            map.on('click', function(e) {
                var latlng = e.latlng;
                self._latlng = latlng.lat + "," + latlng.lng;
                self.stop();
            });
            htmlView.setContent(mapDiv);
            htmlView.setPreferredSize(400, 200);
            return htmlView;
        },
        getDropDownValue: function() {
            return this._latlng;
        },
        afterOpen: function(v) {
            var self = this,
                map = self._map;
            self.getDropDownView().validate();
            self._map.invalidateSize();
            if (v) {
                self._latlng = v;
                var latlng = v.split(",");
                map.setView([latlng[0], latlng[1]], 15);
                self._marker = new L.marker([latlng[0], latlng[1]]);
                self._marker.addTo(map).bindPopup('Here!').openPopup();
            }
        }
    });
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IOTOS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值