监听者模式--前端组件引用

2021-05-11  本文已影响0人  Yluozi

应用场景:

页面引用组件,为实现业务分离,解耦合,组件内部有指定的调用方法及触发事件,在引用组件的父项中声明指定方法,组件触发相应方法,监听到父项对象。

代码实现:

父项声明代码:

function monitorTree() {
  $urtp.Observer.regist('urtp-tree-click-eventHandler', function (data) {
        $("#navi_py a").removeClass("active"); //拼音导航,去掉选中状态
        //重置页面select数据筛选项
        resetOption();

        var v, f, c, u, g, pnode,pname;

        v = data.args.eventData[0].class_code;
        g = data.args.eventData[0].class_grade;
        pnode = $('a[data-id=' + "'" + v + "'" + ']').parents(".contentbox").siblings('.item').find('span');// 查找父节点,获取表信息

        //添加点击效果
        $('a[data-id=' + "'" + v + "'" + ']').parents('dd').siblings().removeClass('on');
        $('a[data-id=' + "'" + v + "'" + ']').parents('dd').addClass('on');
        $('a[data-id=' + "'" + v + "'" + ']').parents('li').siblings().find('dd').removeClass('on');
        $('a[data-id=' + "'" + v + "'" + ']').parents('li').siblings().removeClass('on');
        $('a[data-id=' + "'" + v + "'" + ']').parents('li').addClass('on');

        pname = $('a[data-id=' + "'" + v + "'" + ']').parents('dl').siblings('a').find('i').html();
        f = pnode.attr('data-field');
        c = pnode.attr('data-clsid');
        u = pnode.attr('data-useTableId');
        // data-field分级配置的不同时候:处理
        if (f.indexOf(";") > 0) {
            f = f.split(";")[Number(g) - 1]
        }
        if (!!u && config.tableid != u) {
            config = $urtp.navi.ready({
                dfield: f,
                dvalue: v,
                tableid: u
            }).config;
        } else {
            config = $urtp.navi.ready({
                dfield: f,
                dvalue: v,
                clsid: c,
                tableid: config.tableid //这里需要给tableid赋值,否则在使用其他导航表查询时会出现bug
            }).config;
        }

        //处理导航头部sitemap内容显示
        if ($urtp.isNull(pname)) {
            //当前节点未包含父节点
            if (typeof sitemap_node == "function") {
                sitemap_node($('a[data-id=' + "'" + v + "'" + ']').attr("title"));
            }
        } else {
            //当前节点包含父节点
            if (typeof sitemap_node == "function") {
                sitemap_node(pname);
            }
            if (typeof sitemap_node_children == "function") {
                sitemap_node_children($('a[data-id=' + "'" + v + "'" + ']').attr("title"));
            }
        }
        search();
        $urtp.log.search(config.sysID, 'source_code', config.pykm, 'navi', config.sysCode, null);
    });
};

子组件中的js代码,组件监听并触发事件调用父项值:

$(document).ready(function () {
        $("#DvelopmentTarget1 a").unbind('click').bind('click', function () {
            var value = $(this).attr('data-id');
            //调用setfilter()获取检索的值
            var data = setfilter(modelDataJson, 'class_code', value, '');
            //监听者模式fire()方法,dom里触发监听
            $urtp.Observer.fire('urtp-tree-click-eventHandler', {'eventData': data})

            // navi中检索框内容重置
            $('#navi-srchtext').val('');
        })
})

监听者js方法:

(function (window) {
    var u = {}
    u.Observer = (function () {
        var __messages = {};
        return {
            //父项声明的对象
            regist: function (type, fn) {
                if (typeof __messages[type] === 'undefined') {
                    __messages[type] = [fn]
                } else {
                    __messages[type].push(fn);
                }
            },
            //子项触发监听到父项值
            fire: function (type, args) {
                if (!__messages[type])
                    return;
                var events = {
                        type: type,
                        args: args || {}
                    },
                    i = 0,
                    len = __messages[type].length;
                for (; i < len; i++) {
                    __messages[type][i].call(this, events);
                }
            },
            //移除监听参数
            remove: function (type, fn) {
                if (__messages[type] instanceof Array) {
                    var i = __messages[type].length - 1;
                    for (; i >= 0; i++) {
                        __messages[type][i] === fn && __messages[type].splice(i, 1)
                    }
                }
            }
        }
    })();

 window.$urtp = u;

})(window)
上一篇下一篇

猜你喜欢

热点阅读