Backbone中未定义的方法

时间:2012-09-01 09:41:05

标签: javascript methods backbone.js

我正在尝试将this.moveCursor与Backbone一起使用,但当我console.log时,它表示未定义。该方法明确定义,所以我不确定这里有什么问题。

起初我认为这是因为this.并且switch语句没有返回。

但是,即使console.log语句之外的switch,也是如此。

有人可以帮忙吗?

setup: function(){      
        $(document).on('keydown', this.keyCode);
},

keyCode: function(e){
                switch(e.keyCode) {
                    case 37:  console.log(this.moveCursor(-1,0)); break; //undefined
                    case 38:  return this.moveCursor(0,-1); break;
                    case 39:  return this.moveCursor(1,0); break;
                    case 40:  return this.moveCursor(0,1); break;
                    case 32:  return play.selectBlock(); break;
                    case 13:  return play.selectBlock(); break;
                };

        console.log(this.moveCursor()); //undefined
            }, 



   moveCursor: function(x, y){
                    var cursorSelected = play.get('cursorSelected'),
                        cursorX = play.get('cursorX'),
                        cursorY = play.get('cursorY');



                console.log('moveCursor');

                if(cursorSelected){
                    x += cursorX;
                    y += cursorY;

                    this.getBlock(x,y);
                } else {
                    //
                }
            },

1 个答案:

答案 0 :(得分:1)

您有上下文问题this关键字代表keyCode()函数的调用者,无论keyCode()的定义位于何处。

要了解有关此console.log( this )的尝试的更多信息,它会向您展示执行该时刻的真实this

要解决此问题,您可以使用_.bindAll()

如果keyCode()Backbone.View.events的处理程序,则绑定应该已经完成​​。

更新

我看到keyCode()是普通jQuery事件的处理程序:

$(document).on( 'keydown', this.keyCode );

_.bindAll()适用于此,您也可以使用jQuery.proxy()这样:

$(document).on( 'keydown', $.proxy( this.keyCode, this ) );