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

时间:2014-04-23 16:38:01

标签: javascript jquery constructor new-operator

我使用" new"创建一个对象,初始化它并使用$(this).trigger({type:"myevent", field1:val1})订阅它的事件,如( here - jsfiddle ) ,它的确有效:

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());
        });
    };

我的问题是我有兴趣将selector传递给另一个函数init another jsfiddle ):

        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不会触发事件。

当然,我可以在that中设置init(),或者在构造函数中初始化对象以解决问题,但它让我疯狂为什么"that"成员没有联系到实际对象,如果我在构造函数中设置它并连接到内部函数中的事件,但如果我在同一函数中连接到事件,它确实有效。

感谢。

2 个答案:

答案 0 :(得分:2)

        return {
            init: init
        };

您不应该return来自正在调用的构造函数with new的任何内容。 that引用this object 是一个空的User实例,但不是您返回的init函数的普通对象,已分配给u1并安装了处理程序。

您应该只执行

,而不是返回该对象文字
         this.init = init;

答案 1 :(得分:0)

首先,在传递你的选择器时,尝试:

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

至于在外面传递选择器,请设置:

var mySelector;

在“用户”功能的外部,这样任何其他功能都可以覆盖变量的值,并保持其最后一个值,无论您运行“用户”多少次。然后动态设置您的选择器:

mySelector = $("#but1");