美文网首页
监听者模式--前端组件引用

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

作者: Yluozi | 来源:发表于2021-05-11 11:45 被阅读0次

应用场景:

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

代码实现:

父项声明代码:

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)

相关文章

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

    应用场景: 页面引用组件,为实现业务分离,解耦合,组件内部有指定的调用方法及触发事件,在引用组件的父项中声明指定方...

  • 设计模式-观察者模式

    设计模式-观察者模式 springboot实现 观察者1 观察者2 定义事件 测试方法,发布事假,监听者1.2均监...

  • Angular项目目录结构

    angular结构 主要文件 模块化组件化开发模式 创建组件命令 引用组件 数据绑定

  • 监听者模式

    监听者模式 回调函数: 往组件注册自定义的方法,以便组件在特定场景下调用—这个方法是组件定义的,业务方实现@Slf...

  • React的组件模式

    摘要: 组件是 React 的核心。 原文:React的组件模式 作者:前端小智 Fundebug经授权转载,版权...

  • 组件分享之后端组件——从 postgres 数据库模式生成DOT

    组件分享之后端组件——从 postgres 数据库模式生成DOT描述工具dbdot 背景 近期正在探索前端、后端、...

  • Vue 前端读取excel表格生成js数组

    用到的插件: xlsx 引入xlsx 示例使用的前端框架antd,所以下面直接引用组件 不同前端框架获取到的对象可...

  • 【Android】RxJava的使用

    参考:给 Android 开发者的 RxJava 详解(本文部分内容引用自该博客) RxJava的设计模式:监听者...

  • partridge自动化测试平台

    1. 背景 oss软件整体采用前后端分离的模式,前端采用JQuery自研组件,包含常用web组件。后端采用spri...

  • 快速理解Promise

    一、事件分发机制 事件分发机制是观察者模式的一种实现,常见于UI交互,给界面组件注册监听器,由界面组件发出事件,监...

网友评论

      本文标题:监听者模式--前端组件引用

      本文链接:https://www.haomeiwen.com/subject/gdugdltx.html