2010-07-06 2 views
4

Я пытаюсь создать класс додзё, который содержит функции, которые, в свою очередь вызывать другие функции в этом классе, а именно:Вызов методов объекта внутренне в додзё

dojo.provide("my.drawing"); 
dojo.declare("my.drawing", null, { 
    constructor: function(/* Object */args){ 
     dojo.safeMixin(this, args); 
     this.container = args[0];  
    }, 

    addPoint: function(event){ 
      //calculate the x and y values by offsetting correctly 
      var pos = dojo.coords(container); 
      var x = event.clientX - pos.x; 
      var y = event.clientY - pos.y; 
      this.addAbsPoint(x,y); 
     }, 

    addAbsPoint: function(x,y){ 
     //do something here with the absolute x and y values 
    } 
}); 

выше (обрезается) код, чтобы добавить наведите на поверхность dojo.gfx. Когда я пытаюсь запустить его я получаю следующее сообщение об ошибке консоли:

Uncaught TypeError: Object #<an HTMLDivElement> has no method 'addAbsPoint' 

Функция addPoint (событие) вызывается правильно, но это не удается, когда он пробует ссылаться на функцию addAbsPoint (х, у) в том же объект. Возможно ли это в додзё? Как я могу это сделать?

ответ

3

addPoint() не называется правильно, а не в правильном контексте. Судя по его подписи, мои психические способности говорят мне, что вы используете его как обработчик событий, но вы не делаете это правильно.

Вы делаете это так:

var myDrawing = new my.drawing(someArgs); 

// this is incorrect: 
dojo.connect(someDomNode, "onclick", myDrawing.addPoint); 

// or, less incorrect, yet incorrect too: 
surface.connect("onclick", myDrawing.addPoint); 

В JavaScript вышеприведенные строки передать функцию, а не связанный метод, как можно было бы ожидать. Вы должны передать контекст (объект, чтобы вызвать функцию):

// the node connection: 
dojo.connect(someDomNode, "onclick", myDrawing, "addPoint"); 
// or: 
dojo.connect(someDomNode, "onclick", myDrawing, myDrawing.addPoint); 

// the surface connection: 
surface.connect("onclick", myDrawing, "addPoint"); 
// or: 
surface.connect("onclick", myDrawing, myDrawing.addPoint); 

Кроме того, вы всегда можете использовать dojo.hitch() для связала/контекста сферы, используя замыкание (которое сделано на примерах выше:

var boundMethod = dojo.hitch(myDrawing, "addPoint"); 
// or: 
//var boundMethod = dojo.hitch(myDrawing, myDrawing.addPoint); 

// and now you can do like you did originally: 
dojo.connect(someDomNode, boundMethod); 

// or: 
surface.connect("onclick", boundMethod); 

Читайте об этом в документации:

+0

Отлично, спасибо за быстрый, полный и краткий ответ. Это сработало полностью. Я полностью упустил сторону обработки событий, потому что произошла ошибка, пытаясь получить доступ ко второму методу, надеюсь, не ошибка, которую я скоро буду делать! – spikeheap

+0

также стоит указать, что использование переменной 'container' в вышеуказанной функции addPoint не имеет источника. Вероятно, это будет.контейнер – dante

Смежные вопросы