Называть метод в Mootools, правильный путь? - PullRequest
2 голосов
/ 04 апреля 2011

Я создал класс в mootools, который при первом вызове метода initialize () создает элементы div, которые затем добавляются в document.body.Затем я присоединяю обработчик контекстного меню, который будет вызывать функции, когда в браузере выбрана опция из контекстного меню.

Проблема, с которой я столкнулся, заключается в том, что обработчик контекстного меню фактически не вызывает никаких функций, и я не могуЯ выяснил причину и спросил, может ли кто-нибудь здесь обнаружить проблему.

Вот класс, который я создал, и прикрепленный обработчик контекстного меню, для краткости некоторые другие коды были удалены:

var uml_Canvas = new Class({  
    initialize: function()
    {
        this.mainCanvasDiv = document.createElement("div");
        this.mainCanvasDiv.id = "mainCanvas";
        this.mainAppDiv.appendChild(this.mainCanvasDiv);
        this.paper = Raphael(this.mainCanvasDiv.id, 500, 400);
        this.paper.draggable.enable();

        $("#"+this.mainCanvasDiv.id).contextMenu('canvasPanel_Menu', 
        {
            bindings: 
            {
                'clear': function(t) 
                {
                    this.clearPaper();
                }
            }
         });  
    },
    clearPaper : function()
    {
        this.paper.clear();
    }
});

Итак, краткий обзор: создается объект, который создает div и затем добавляет его в тело.Затем div получает контекстное меню.Когда вызывается опция 'clear', должен вызываться метод clearPaper (), по какой-то причине это не так.Однако если я заменю строку this.clearPaper(); простым вызовом alert (), он действительно запустится.

Может кто-нибудь увидеть причину, по которой невозможно вызвать метод?

Спасибо за любые отзывы.

Кстати, я получаю ошибку this.clearPaper is not a function, если это поможет.

1 Ответ

1 голос
/ 04 апреля 2011

Попробуйте связать «this» с вашей функцией очистки:

'clear': function(t) 
{
    this.clearPaper();
}.bind(this)

Это берет область «this» и позволяет анонимной функции использовать ее, как если бы она была членом этого класса.

Обратите внимание, что вы должны делать это всякий раз, когда пытаетесь использовать «это».внутри любой анонимной функции.Например, если у вас внутри класса:

method: function() {
    button.addEvent('click', function(e) {
        new Request({
            onComplete: function(res) {
                this.process_result(res);
            }
        }).send();
    });
},
process_results: function(res) {...}

Вы должны выполнить привязку до конца:

method: function() {
    button.addEvent('click', function(e) {
        new Request({
            onComplete: function(res) {
                this.process_result(res);
            }.bind(this)
        }).send();
    }.bind(this));
},
process_results: function(res) {...}

Обратите внимание на новые функции bind () в функции события иФункция onComplete.Это может показаться раздражающим дополнительным шагом, но без этого у вас не будет возможности для всех.Mootools позволяет чрезвычайно просто взять область вашего класса и прикрепить ее к анонимной функции.

...