изменение: исходное событие в JointJS

Всех с Рождеством!

Я хочу что-то сделать при изменении исходного или целевого элемента Joint.dia.Link. Сначала я попытался поместить код в функцию обратного вызова событий «change: source» и «change: target». Однако оказывается, что эти функции обратного вызова вызываются при изменении позиции ссылки, а не при изменении исходного или целевого элемента. Затем я попытался поместить код в функцию LinkView.pointup(), добавив тег, который установлен в функции обратного вызова событий «change: source» и «change: target», чтобы указать измененный элемент. Полученный код выглядит следующим образом:

link.on('change:source', function(){this.src_changed = true;});
link.on('change:target', function(){this.dest_changed = true;});

joint.shapes.custom.ModelLink = joint.dia.Link.extend({
     defaults: joint.util.deepSupplement({
        type: 'custom.ModelLink',
    }, joint.dia.Link.prototype.defaults)
});

joint.shapes.custom.ModelLinkView = joint.dia.LinkView.extend({
    pointerdown: function () {
        joint.dia.LinkView.prototype.pointerdown.apply(this, arguments);
    },
    pointermove: function () {
        joint.dia.LinkView.prototype.pointermove.apply(this, arguments);
    },
    pointerup: function (evt, x, y) {
        var link = this.model;
        if(link.src_changed) { // do something}
        if(link.dest_changed) {// do something}
        joint.dia.LinkView.prototype.pointerup.apply(this, arguments);
    }
});

Однако я обнаружил, что src_changed и dest_changed иногда имеют значение true, когда я просто перетаскиваю один конец ссылки. Почему это происходит? Как я могу это исправить? Или любой новый подход, чтобы сделать какой-то ответ на изменение исходного или целевого элемента?

Кроме того, после того, как я сбросил события join.shapes.uml.State с помощью model.set('events', events), текст на графике не меняется? Как я могу обновить график, чтобы показать измененный элемент состояния?

Большое спасибо!


person user2960022    schedule 25.12.2013    source источник
comment
ОК, кажется, все улажено после того, как я поместил следующую строку:joint.dia.LinkView.prototype.pointerup.apply(this, arguments); быть первой строкой в ​​pointerup:function(){}.   -  person user2960022    schedule 26.12.2013


Ответы (1)


События change:source и change:target действительно запускаются также при изменении положения стрелок. В общем случае source и target ссылки могут быть либо точкой (объект со свойствами x и y), либо элементом (а в ближайшем будущем и ссылкой) - объектом со свойством id, указывающим на связанный элемент. Если вас интересует только то, что source/target является элементом, вы можете просто проверить в своих обработчиках событий change:source и change:target, содержат ли source/target ссылки свойство id:

if (this.get('source').id) { /*... do something ...*/ }

person dave    schedule 26.12.2013
comment
Да, точно. Я разместил свое решение в группах Google. Большое спасибо! - person user2960022; 27.12.2013