【问题标题】:How to assign events in revealing prototype pattern?如何在显示原型模式中分配事件?
【发布时间】:2011-12-30 16:04:28
【问题描述】:

我正在尝试实现显示模块模式。我需要为其中一个元素分配一个事件处理程序,这个事件处理程序是我在原型中定义的一个函数,但我得到 this.trigger is not a function 错误。

这是我所做的:

//constructor
var MyClass = function (settings) {
   this.someElement=$(settings.elementID);
}

//prototype    
MyClass.prototype = function() {
    var init = function() {
        this.someElement.change(this.handler);
    },
        handler = function() {
        this.someElement.hide();
    };

    return {
        init : init,
        handler : handler
    };
}();

我是这样称呼它的:

var myClass = new MyClass();
myClass.init();

【问题讨论】:

  • 我看不出this.trigger 来自哪里。
  • 我正在尝试对处理程序中的 this.someElement 做一些事情。这是关闭的问题吗?
  • 我看到的一个问题是在 MyClass.prototype 中,处理程序的范围不正确。没有“var”,它会被全局声明,你可能不想要。可能不是问题,但您仍然应该解决它。那么您是否尝试从“新”实例调用处理程序?您还应该发布调用此方法的代码。
  • @thescientist 它有一个来自先前声明的 var 子句。注意','
  • @Ufuk,啊,我明白了。感谢您指出这一点。

标签: javascript design-patterns revealing-module-pattern


【解决方案1】:

我猜你的构造函数应该是

var MyClass = function (settings) {
    this.someElement = jQuery("#" + settings.elementID);
}

然后您将能够使用(new MyClass({elementID:"someid"})).someElement.trigger() 在该元素上调用jQuerys trigger 方法,因为“触发器”是jQuery 实例的方法,它是您对象的“someElement”属性。

此外,您的处理程序将不起作用,因为它是在元素的上下文中调用的,而不是在您的对象的上下文中。所以应该是

MyClass.prototype.init = function init() {
    this.someElement.change(this.handler || function defaulthandler() {
        $(this).hide();
    });
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多