jQuery事件触发器+构造函数模式

jQuery event trigger + constructor pattern

本文关键字:构造函数 模式 触发器 事件 jQuery      更新时间:2023-09-26

我用"new"创建一个对象,初始化它,并用$(this).trigger({type:"myevent", field1:val1})订阅它的事件,比如(here-jswiddle),它可以工作:

var Users = function (selector) {
        var that = this;
        var myButton;
        //function to trigger
        function add(name) {
            console.log("before trigger for: $('"+selector+"') with ["+name+"]")
            $(that).trigger({
                type: "user-added",
                name: name,
                date: new Date(),
            });
        }
        $(selector).click(function () {
            add($("#name").val());
        });
    };

我的问题是,我有兴趣在单独的函数init另一个jsfiddle)中传递selector

        var Users = function () {
            var that = this;
            var mySelector;
            //function to trigger
            function add(name) {
                console.log("before trigger for: $('" + mySelector + "') with [" + name + "]")
                $(that).trigger({
                    type: "user-added",
                    name: name,
                    date: new Date(),
                });
            }
            function init(selector) {
                mySelector = selector;
                $(selector).click(function () {
                    add($("#name").val());
                });
            }
            return {
                init: init
            };
        };

在这种情况下,代码正在崩溃:

当事件被触发时,函数看到的that对象看起来像Users {}

并且没有像工作样本中那样更新:Users {jQuery11111210404012482791554801678404482030027643403015099466: Object}

因此jQuery不会触发该事件。

当然,我可以在init()中设置that,或者在构造函数中初始化对象来解决问题,但如果我在构造函数中设置它并连接到内部函数中的事件,"that"成员就不会连接到实际对象,而如果我在同一函数中连接到事件,它就会起作用,这让我抓狂。

谢谢。

        return {
            init: init
        };

您不应该从使用new调用的构造函数中return任何内容。that引用的this对象是一个空的User实例,但不是具有您返回、分配给u1并在其上安装处理程序的init函数的普通对象。

与其返回对象文字,您应该只执行

         this.init = init;

首先,在传入选择器时,尝试:

var u = new Users($("#but1"));

对于外侧的通过选择器,设置:

var mySelector;

在"Users"函数的外部,通过这种方式,任何其他函数都可以覆盖变量的值,并保留其最后一个值,无论您运行"Users"多少次。然后动态设置选择器,如下所示:

mySelector = $("#but1");