Quantcast
Channel: GoJS - Northwoods Software
Viewing all articles
Browse latest Browse all 7069

Some newbie questions

$
0
0

@xopik wrote:

Hello,

Your component is just amazing.

I'm sorry for my looooong topic (and for my bad english) but I have some newbie questions :

If understand, each item in the nodeDataArray correspond to a node (a group or a non link part). We can use binding to link an attribute value to an object property (like the fill color).

[
 { key: "123", attribute1: 'A', attribute2: 'B' },
 { key: "234", attribute1: 'A', attribute2: 'B' }
]

When we use an itemArray to create children components, binding in the itemTemplate it refers to the child attribute (so only the attribute3).

[
 { key: "123", attribute1: 'A', attribute2: 'B' , children: [ { key: '1123', attribute3: 'C' ]},
 { key: "234", attribute1: 'A', attribute2: 'B' , children: [ { key: '1123', attribute3: 'C' ]}
]

Add properties dynamically

Imagine, each node child is a port and we want to add some properties dynamically (to simplify the initial model). How do add this properties from the itemTemplate or another place to the model (I know I can listen a changedEvent to add this properties but is it the correct way) ? My itemtemplate is like this...

itemTemplate() {
  const circle = this.go(go.Shape, 'Rectangle',
    {
      strokeWidth: 0,
      desiredSize: new go.Size(12, 12),
      cursor: 'pointer',
      fromSpot: go.Spot.Left,
      toSpot: go.Spot.Right,
    },
    new go.Binding('fromLinkable', 'fromLinkable'),
    new go.Binding('toLinkable', 'toLinkable'),
    new go.Binding('portId', 'portId'),
  );

  const panel = this.go(go.Panel, 'Horizontal', {
     alignment: go.Spot.Left,
     margin: new go.Margin(2, 2),
  });

  panel.add(circle);

  return panel;
}

I tried to add new data property like this :

model.setDataProperty(circle, 'acustomproperty', false);

But I receive a "GraphLinksModel.setDataProperty is modifying a GraphObject, "Shape(Rectangle)#488" Is that really your intent?" message and the corresponding parts in the node.data are not updated. So at this time, is use a binding to add this values, but it's probably not the correct way to do it :

this.go(go.Panel, 'Vertical',
  this.addProperties(),
  {
     itemTemplate: this.itemTemplate(),
   },
),

...

addProperties() {
  const bind = new go.Binding('itemArray', 'ports');
  bind.converter = (ports, target) => {
    const value = ports.map((port) => {
      port.acustomproperty = null;
      return port;
    });
    if (value === undefined) return target.itemArray;
    return value;
  };
  return bind;
}

2 Update child property from events

Now imagine a link is created (or relinked, or deleted) between two nodes port. I listen the LinkDrawn, LinkRelinked or SelectionDeleted events. I can retrieve the from/to Node and from/to Port but how to update the corresponding "acustomproperty" of each port in the model for the selected node. Once time again I tried with :

model.setDataProperty(e.subject.fromPort, 'acustomproperty', true);

I have the same message "GraphLinksModel.setDataProperty is modifying a GraphObject, "Shape(Rectangle)#488".

At this time (and it's a workaround), I change (the code is more complex) the data property like this :

onLinked(e) {
  const fromNode = e.subject.fromNode;
  const index = fromNode.data.ports.findIndex((port) => {
    return port.portId === portId;
  });

  fromNode.data.ports[index].acustomproperty = true;
  ...

3 Colored link

On the onLinked method above, I "compute" the color link (and other properties) from properties retrieves on each port. At this time (and it's allways a workaround), I get this value like this :

onLinked(e) {
   ...

  const ret = toNode.data.ports.filter((port) => {
     return port.portId === portId;
  });

  let toAnotherproperty = null;
  if (ret.length !== 0) {
     toAnotherproperty = ret[0].anotherproperty;
  }

  ...
  if (fromAnotherProperty === 1 && toAnotherProperty === 1) linkColor = '#FF0000';
  ...

Two questions in one :

1. How to get this value (the are no getDataProperty)
2. That work's perfectly for a new link but not for links created from the linkDataArray. In this case, how to modify properties of each links created by the linkDataArray before it draw them ? I can add a listener on addModelChangedListener and modify each link when the transaction is finished but is this the correct method ?

2 Mapping

It's my last question :) How to create a mapping to retrieve from a child a parent attribute ?

Thanks you !

Posts: 2

Participants: 2

Read full topic


Viewing all articles
Browse latest Browse all 7069

Trending Articles