Графический поиск элемента по имени элемента в JointJS

У меня проблема в Rappid/jointJS

У меня есть в stencil.js 4 формы (2 basic.Circle и 2 basic.Rect) с именами START (basic.Circle), END (basic.Circle), Activity (basic.Rect) и Workitem (basic.Rect) и < strong>Я хочу в моем main.js из всего моего графика получить базовую форму с именем (я имею в виду с текстом attrs) «Активность».

Это описание трафарета для «Активности»:

new joint.shapes.basic.Rect({ size: { width: 5, height: 3 },
attrs: {
    rect: {
         rx: 2, ry: 2, width: 50, height: 30,
         fill: '#0000FF'
       },
       text: { text: 'Activity', fill: '#ffffff', 'font-size': 10, 
       stroke: '#000000', 'stroke-width': 0 }
     }
}), 

Как я его получу? Единственный способ, которым я могу искать на своем графике, - это если ячейка имеет тип basic.Circle (использование get('type') === 'basic.Circle')). но с типом Circle у меня есть два элемента: Activity и Workitem.

Неужели так сложно найти элемент графика с именем: «Активность»?

заранее спасибо


person Reputated_Enginius    schedule 21.09.2016    source источник
comment
Что вы имеете в виду под именем? Вы указали это как свойство атрибута модели?   -  person Sajith Dilshan    schedule 21.09.2016
comment
Да, @SajithDilshan, у меня есть текст атрибута. Вы можете помочь мне получить доступ к Activity? Это описание трафарета для Activity: new Joint.Shapes.basic.Rect({ size: { width: 5, height: 3 }, attrs: { rect: { rx: 2, ry: 2, width: 50, height: 30, заливка: '#0000FF' }, текст: { текст: 'Активность', заливка: '#ffffff', 'размер шрифта': 10, обводка: '#000000', 'ширина обводки': 0 } } }),   -  person Reputated_Enginius    schedule 22.09.2016


Ответы (4)


Вы можете получить все элементы (кроме ссылок) следующим методом

var allElement = graph.getElements()

Далее, если вы хотите получить элементы с «Активностью», выполните следующие действия.

var activityElements = [];

allElement.forEach(elem => {
    var textVal = elem.attributes.attrs.text.text;
    if(textVal !== undefined && textVal === 'Activity') {
        activityElements.push(elem);
    }
});

Теперь массив activityElements будет содержать все необходимые вам элементы.

person Sajith Dilshan    schedule 23.09.2016

Я решил свою проблему, взяв данные элемента в формате JSON:

 _.each(this.graph.getElements(), function(element) {


             if(element.attributes.attrs["text"]["text"] == "Activity"){
             //alert("YEAHHHHHH");
             }

            });
person Reputated_Enginius    schedule 23.09.2016
comment
Строки JSON.stringify() и JSON.parse() избыточны. переменная element уже является объектом Javascript. - person Sajith Dilshan; 23.09.2016
comment
Спасибо, @SajithDilshan, но if(element.attrs[text][text] == ​​Activity){ //alert(YEAHHHHHH); } не работает в моем случае. Вы знаете, как это сделать? - person Reputated_Enginius; 23.09.2016
comment
Должно быть if(element.attributes.attrs[text][text] == ​​Activity). Кроме того, вы можете проверить полную структуру объекта элемента, выполнив console.log(element), и это напечатает объект в консоли браузера. - person Sajith Dilshan; 23.09.2016

вы также можете использовать API для элемента, element.attr('text') возвращает объект text из формы: { text: 'Activity', fill: '#ffffff', 'font-size': 10, stroke: '#000000', 'stroke-width': 0 }

person vt.    schedule 03.10.2016

Вы также можете установить атрибут «id» для своей фигуры и использовать graph.getCell('id_name_goes_here');, что было бы намного проще, если бы вы не возражали против добавления поля id к каждой фигуре.

person Dominic Holt    schedule 29.06.2018