javascript - MooTools 在方法和内部函数中绑定(bind)/保持类范围

标签 javascript scope mootools

我正在尝试使用 Mootools 将按钮动态添加到页面。一切正常,除了 addButton 函数中的 addEvent。我收到一条错误消息,指出“对象 javascript:void(0) 的属性‘sayHi’;不是函数”。

我假设这是由于我的范围,我必须以某种方式将 addButton 函数绑定(bind)回全局“this”?有人可以解释我做错了什么吗?谢谢!

var myClass = new Class({
    initialize: function(){
        this.sayHi();
    },

    sayHi: function(){
        alert('Hello World!');
    },

    addButton: function(){
        this.hiButton = new Element('a', {
            id: 'sayhi',
            html: 'Hi!',
            href: 'javascript:void(0);',
            events: {
                click: function(){
                    this.sayHi();
                }
            }
        }).inject($('myDiv'));
    }
});    

最佳答案

问题是在您的点击处理程序中,this 值不再是原始对象,而是被点击的按钮。

可能有一种特定于 MooTools 的方法来解决这个问题,但是将这个对象创建包装在一个函数中将是解决这个问题的一种简单、原生的方法:

function getMyClass(){
   var self = new Class({
       initialize: function(){
           this.sayHi();
       },

       sayHi: function(){
           alert('Hello World!');
       },

       addButton: function(){
           this.hiButton = new Element('a', {
               id: 'sayhi',
               html: 'Hi!',
               href: 'javascript:void(0);',
               events: {
                   click: function(){
                       self.sayHi();
                   }
               }
          }).inject($('myDiv'));
       }
   });

   return self;
}    

然后

var myClass = getMyClass();

编辑

虽然以上是 JavaScript 中相当标准的惯用语,但我听说它不能很好地与 MooTools 配合使用。如果是这样的话,我会这样做(正如另一个答案已经提到的那样):

var myClass = new Class({
    initialize: function(){
        this.sayHi();
    },

    sayHi: function(){
        alert('Hello World!');
    },

    addButton: function(){
        var self;
        this.hiButton = new Element('a', {
            id: 'sayhi',
            html: 'Hi!',
            href: 'javascript:void(0);',
            events: {
                click: function(){
                    self.sayHi();
                }
            }
        }).inject($('myDiv'));
    }
});    

关于javascript - MooTools 在方法和内部函数中绑定(bind)/保持类范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8524468/

相关文章:

javascript - 如何立即查看输入中的文本

javascript - Mootools 的图像缩放

javascript - 关于从输出中隐藏文本字符串的代码的几个问题

javascript - 如何使用 Meteor 将列表每一行的列值存储到集合中?

compiler-errors - arduino else if语句错误

python,访问模块外部变量的引用

javascript - 异步 AJAX 调用在函数调用后完成。无需 JQUERY 即可解决

javascript - Ember Cli 组件中数据列表满足条件的 bool 值

python - UnboundLocalError : local variable referenced before assignment - except it isn't? 全局/局部范围问题

javascript - 如何在 mootools 中扩展在 "options"内声明的函数?