Хранить объект Raphael в переменной из плагина ZPD - PullRequest
0 голосов
/ 12 октября 2011

Ранее я работал с Рафаэлем, но вернулся к своему проекту и решил полностью переписать его, чтобы улучшить производительность и общее качество кода. В любом случае, приложение использует Рафаэля для создания Mind Maps (если вы читали мои предыдущие вопросы, у вас будет больше представления об общем приложении).

Поэтому я создаю узлы на холсте, используя paper.circle () и т. Д., И чтобы избежать ненужной работы с помощью .drag (), я решил использовать плагин Raphael ZPD . Плагин слишком сложен для меня, чтобы понять его полностью, но я собираюсь немного его отредактировать. Я хотел бы сохранить активный узел в переменной _node. Для этого я думал, что это будет так же просто, как получить evt.target и присвоить его, но, очевидно, это не так.

Вот часть плагина (бит, где я думаю, что назначение должно идти):

/**
 * Handle mouse button release event.
 */
me.handleMouseUp = function(evt) {
    if (evt.preventDefault)
        evt.preventDefault();

    evt.returnValue = false;

    var svgDoc = evt.target.ownerDocument;

    if ((me.state == 'pan' && me.opts.pan) || (me.state == 'move' && me.opts.drag)) {
        // Quit pan mode
        me.state = '';
    }
};

При использовании alert(evt.target); (при нажатии на кружок) мне дается:

[объект SVGCircleElement]

, что означает, что evt.target получает отдельный элемент (как он изменяется для других фигур), но затем пытается манипулировать _node после неудачного присвоения. Я получаю сообщение об ошибке:

_node.attr не является функцией

(я попытался изменить attr (), так как это была самая простая функция).

Я перепробовал много вариантов, используя node, evt.target, evt.currentTarget и т. Д., Но я уверен, что мне просто не хватает чего-то глупого с evt.target, потому что он выдает правильный вывод при предупреждении.

Я понимаю, что me. определяется в другом месте кода, поэтому, если вам нужно, просмотрите ссылку выше (кажется, лучше, чем публиковать полный плагин здесь).

Буду признателен за любую помощь, которую вы можете оказать.

Спасибо.

ОБНОВЛЕНИЕ: Теперь я на 100% уверен, что я должен хранить evt.target в _node, но может показаться, что нет прямой связи между SVG, DOM и Raphael. Любые идеи о том, как я мог бы связать элемент SVG обратно с Рафаэлем?

1 Ответ

1 голос
/ 16 января 2012

Я начал использовать этот плагин на прошлой неделе и столкнулся с той же проблемой.

Я могу связать фигуру SVG обратно с ручкой Рафаэля к фигуре.

По сути, сначала вы должны сохранить указатель на бумажный объект Raphael, связанный с подключаемым объектом zpd. Я делаю это, создавая объявление raphPaper после строки var opts = {...}

var raphPaper = null;

Так что объект raphPaper будет доступен так же, как объект opts.

Когда Рафаэль создает фигуру, он назначает две переменные (которые я нашел): .raphael и .raphaelid .raphael - это логическое значение, сообщающее нам, был ли рафаэль создан формой SVG, а .raphaelid дает нам внутренний идентификатор рафаэля для формы SVG. Итак, чтобы получить элемент Raphael, мы просто используем getById для нашего бумажного объекта (raphPaper).

if(evt.target.raphael){
    var raphShp = raphPaper.getById(evt.target.raphaelid);
}

Так что для вашей проблемы вам просто нужно назначить raphShp для _node или любой другой переменной, к которой вы хотите получить доступ.

...