vue中go.js的使用教学(五:数据绑定)

news2025/7/20 2:35:26

一、一个简单的数据绑定(go.Binding)看注释为绑定

  diagram.nodeTemplate =
    $(go.Node, "Auto",
      $(go.Shape, "RoundedRectangle",
        { fill: "white" },
        new go.Binding("fill", "color")),  // shape.fill = data.color
      $(go.TextBlock,
        { margin: 5 },
        new go.Binding("text", "key"))  // textblock.text = data.key
    );

  diagram.linkTemplate =
    $(go.Link,
      $(go.Shape,
        new go.Binding("stroke", "color"),  // shape.stroke = data.color
        new go.Binding("strokeWidth", "thick")),  // shape.strokeWidth = data.thick
      $(go.Shape,
        { toArrow: "OpenTriangle", fill: null },
        new go.Binding("stroke", "color"),  // shape.stroke = data.color
        new go.Binding("strokeWidth", "thick"))  // shape.strokeWidth = data.thick
    );

  var nodeDataArray = [
    { key: "Alpha", color: "lightblue" },
    { key: "Beta", color: "pink" }
  ];
  var linkDataArray = [
    { from: "Alpha", to: "Beta", color: "blue", thick: 2 }
  ];
  diagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);

显示如图:

 

二、绑定对象属性,如部件位置 

还可以对具有对象值的数据绑定属性。例如,数据绑定 Part.location 属性是很常见的。

Part.location 的值是一个点,因此在此示例中,数据属性必须是点。

diagram.nodeTemplate =
    $(go.Node, "Auto",
      new go.Binding("location", "loc"),  // 绑定的属性值为location,绑定的值为nodeDataArray里的loc值
      $(go.Shape, "RoundedRectangle",
        { fill: "white" },
        new go.Binding("fill", "color")),
      $(go.TextBlock,
        { margin: 5 },
        new go.Binding("text", "key"))
    );

  var nodeDataArray = [
    // for each node specify the location using Point values
    { key: "Alpha", color: "lightblue", loc: new go.Point(0, 0) },
    { key: "Beta", color: "pink", loc: new go.Point(100, 50) }
  ];
  var linkDataArray = [
    { from: "Alpha", to: "Beta" }
  ];
  diagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);

生成的图:

 

三、转换函数(类似自定义值)

Point 类包含一个静态函数 Point.parse,可用于将字符串转换为 Point 对象。它期望输入字符串中有两个数字,表示 Point.x 和 Point.y 值。它返回具有这些值的 Point 对象。

可以将转换函数作为第三个参数传递给 Binding 构造函数。在本例中,它是 Point.parse。这允许以字符串 (“100 50”) 的形式指定位置,而不是作为返回 Point 的表达式指定。对于模型对象上的数据属性,您通常需要使用字符串作为点s、大小s、矩形s、边距s 和点s 的表示形式,而不是对这些类对象的引用。字符串很容易在JSON和XML中读写。尝试读取/写入对象的类会占用额外的空间,并且需要编写器和读取器的额外合作。

举例简洁:

 diagram.nodeTemplate =
    $(go.Node, "Auto",
      new go.Binding("location", "loc", go.Point.parse),  //  关键代码
      $(go.Shape, "RoundedRectangle",
        { fill: "white" },
        new go.Binding("fill", "color")),
      $(go.TextBlock,
        { margin: 5 },
        new go.Binding("text", "key"))
    );

  var nodeDataArray = [
    { key: "Alpha", color: "lightblue", loc: "0 0" },  // 值以“0 0”的形式
    { key: "Beta", color: "pink", loc: "100 50" }
  ];
  var linkDataArray = [
    { from: "Alpha", to: "Beta" }
  ];
  diagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);

 生成图:与上图一致

正文:

下面是一个示例,该示例将多个 Shape 属性数据绑定到名为“highlight”的同一布尔数据属性。每个转换函数都采用布尔值,并为数据绑定的属性返回适当的值。

注:请注意,转换函数只能返回属性值。不能返回图形对象来替换部件的可视树中的对象。如果需要基于绑定数据显示不同的 GraphObjects,可以绑定 GraphObject.visible 或 GraphObject.opacity 属性。如果你真的想要不同的视觉结构,你可以使用多个模板(模板地图)。

diagram.nodeTemplate =
    $(go.Node, "Auto",
      new go.Binding("location", "loc", go.Point.parse),
      $(go.Shape, "RoundedRectangle",
        { // 这边的highlight使用了函数返回的形式
          fill: "yellow", stroke: "orange", strokeWidth: 2 },
        new go.Binding("fill", "highlight", function(v) { return v ? "pink" : "lightblue"; }),
          // 这边的highlight使用了函数返回的形式
        new go.Binding("stroke", "highlight", function(v) { return v ? "red" : "blue"; }),
        new go.Binding("strokeWidth", "highlight", function(v) { return v ? 3 : 1; })),
      $(go.TextBlock,
        { margin: 5 },
        new go.Binding("text", "key"))
    );

  var nodeDataArray = [
    { key: "Alpha", loc: "0 0", highlight: false },// 定义的highlight值为布尔值用来判断执行自定义
    { key: "Beta", loc: "100 50", highlight: true },
    { key: "Gamma", loc: "0 100" }  // 这边的highlight值为空,用来判断为控制的情况下
  ];
  var linkDataArray = [
    { from: "Alpha", to: "Beta" }
  ];
  diagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);

生成的图:

 

 四、更改数据值

上述示例都取决于创建部件时要评估的数据绑定,并且其 Panel.data 属性设置为引用相应的节点或链接数据。当关系图在设置 Diagram.model 时为模型中的数据创建图表部件时,这些操作会自动发生。

对于大多数数据属性,即模型不专门处理但绑定数据的属性,只需调用 Model.setDataProperty。

官方例子:

 diagram.nodeTemplate =
    $(go.Node, "Auto",
      { locationSpot: go.Spot.Center },
      $(go.Shape, "RoundedRectangle",
        { // 自定义highlight
          fill: "yellow", stroke: "orange", strokeWidth: 2 },
        new go.Binding("fill", "highlight", function(v) { return v ? "pink" : "lightblue"; }),
        new go.Binding("stroke", "highlight", function(v) { return v ? "red" : "blue"; }),
        new go.Binding("strokeWidth", "highlight", function(v) { return v ? 3 : 1; })),
      $(go.TextBlock,
        { margin: 5 },
        new go.Binding("text", "key"))
    );

  diagram.model.nodeDataArray = [
    { key: "Alpha", highlight: false }  // just one node, and no links
  ];

  function flash() {
    // 所有模型更改都应该发生在事务中
    diagram.model.commit(function(m) {
      var data = m.nodeDataArray[0];  // 获取第一个数组node的值
      m.set(data, "highlight", !data.highlight);//设置data值里的highlight为!data.highlight
    }, "flash");
  }
  function loop() {
//每0.5秒执行一次修改
    setTimeout(function() { flash(); loop(); }, 500);
  }
  loop();

第会动

假设500毫秒了: 

 五、更改图形结构

对于模型知道的数据属性(如链接数据的“to”或“from”),必须调用相应的模型方法才能修改数据属性。直接修改数据属性而不调用相应的模型方法可能会导致不一致或未定义的行为。

例子(官方的连接,更改“to”连接的属性)getToKeyForLinkData和setToKeyForLinkData的使用

diagram.nodeTemplate =
    $(go.Node, "Auto",
      { locationSpot: go.Spot.Center },
      $(go.Shape, "RoundedRectangle",
        { fill: "yellow", stroke: "orange", strokeWidth: 2 }),
      $(go.TextBlock,
        { margin: 5 },
        new go.Binding("text", "key"))
    );

  var nodeDataArray = [
    { key: "Alpha" },
    { key: "Beta" },
    { key: "Gamma" }
  ];
  var linkDataArray = [
    { from: "Alpha", to: "Beta" }
  ];
  diagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);

  function switchTo() {
    // 所有的操作都在方法内执行
    diagram.model.commit(function(m) {
      var data = m.linkDataArray[0];  // 获取第一个linkDataArray得node值
      if (m.getToKeyForLinkData(data) === "Beta")
        m.setToKeyForLinkData(data, "Gamma");
      else
        m.setToKeyForLinkData(data, "Beta");
    }, "reconnect link");
  }
  function loop() {
    setTimeout(function() { switchTo(); loop(); }, 1000);
  }
  loop();

示例图:原本指向Beta,1秒后指向Gamma

 六、绑定到图形对象

 Shape.fill 绑定到 Part.isSelected 属性。选择或取消选择节点时,属性将更改值,因此将评估绑定。转换函数获取布尔值,并返回要用作形状填充的所需画笔颜色。本示例还关闭选定装饰,以便通过形状的填充颜色来判断节点是否被选中的唯一直观方法。isSelected:isSelected

 diagram.nodeTemplate =
    $(go.Node, "Auto",
      { selectionAdorned: false },  // 显示选中边框
      $(go.Shape, "RoundedRectangle",
        //isSelected默认fasle,true(操作型属性无法在模板定义,只能在节点生成后操作)例如,节点或线对象.isSelected=true;
        new go.Binding("fill", "isSelected", function(sel) {
              return sel ? "dodgerblue" : "lightgray";
            }).ofObject()),  // no name means bind to the whole Part
      $(go.TextBlock,
        { margin: 5 },
        new go.Binding("text", "descr"))
    );

  diagram.model.nodeDataArray = [
    { descr: "Select me!" },
    { descr: "I turn blue when selected." }
  ];

点击按钮后使图形变颜色 

 

七、绑定到共享模型.模型数据源 

 绑定源对象可以是第三种源,除了 Panel.data 或面板中的某些 GraphObject 之外。它也可以是 JavaScript 对象,即共享的 Model.modelData 对象。这允许将节点或链接元素属性绑定到模型中将存在的共享属性,即使模型中不存在节点或链接,也可以对其进行修改。

eg:Shape.fill 绑定到 Model.modelData 对象上的“color”属性。单击该按钮时,函数通过调用 Model.setDataProperty 来修改对象。changeColor modelData

diagram.nodeTemplate =
  $(go.Node, "Auto",
    $(go.Shape, "RoundedRectangle",
      { fill: "white" },  // 默认给的颜色,如果nodeDataArray没有color属性
      new go.Binding("fill", "color").ofModel()),  // model.modelData的属性
    $(go.TextBlock,
      { margin: 5 },
      new go.Binding("text"))
  );

// 设置刚开始默认颜色为黄色
diagram.model.modelData.color = "yellow";

diagram.model.nodeDataArray = [
  { text: "Alpha" },
  { text: "Beta" }
];
//支持 Ctrl-Z 和 Ctrl-Y 操作 (撤回和复原)
diagram.undoManager.isEnabled = true;

changeColor = function() {  //  定义一个名为"changeColor"的函数,可通过button.onclick调用
  diagram.model.commit(function(m) {
    // alternate between lightblue and lightgreen colors
    var oldcolor = m.modelData.color;
    var newcolor = (oldcolor === "lightblue" ? "lightgreen" : "lightblue");
    m.set(m.modelData, "color", newcolor);
  }, "changed shared color");
}

官网图例:数据绑定 |GoJS 

 八、双向数据绑定

希望能够将值从 GraphObject传输回模型数据,以使模型数据与图表保持同步。这可以通过使用双向绑定来实现,该绑定不仅可以将值从源传递到目标,还可以从目标对象传递回源数据。

eg:单击按钮以移动节点。效果基本上是用户拖动节点时发生的情况。在此示例中,节点位置上的双向绑定将更新节点数据的“loc”属性,该节点数据是节点的部件数据。

diagram.nodeTemplate =
    $(go.Node, "Auto",
      { locationSpot: go.Spot.Center },
      new go.Binding("location", "loc").makeTwoWay(),  // 双向绑定makeTwoWay Binding
      $(go.Shape, "RoundedRectangle",
        { fill: "lightblue", stroke: "blue", strokeWidth: 2 }),
      $(go.TextBlock,
        { margin: 5 },
        new go.Binding("text", "key"))
    );

  var nodeDataArray = [
    { key: "Alpha", loc: new go.Point(0, 0) }
  ];
  diagram.model = new go.GraphLinksModel(nodeDataArray);

  shiftNode = (function() {  // 定义一个名为“shiftNode”的函数,可通过button.onclick调用
    // 所有模型更改都应该发生在事务中
    diagram.commit(function(d) {
      var data = d.model.nodeDataArray[0];  // get the first node data
      var node = d.findNodeForData(data);   // find the corresponding Node
      var p = node.location.copy();  // 复制位置,一个点
      p.x += 10;
      if (p.x > 200) p.x = 0;
      // 修改节点。位置也会改变数据。loc属性由于双向绑定
      node.location = p;
      // 显示节点数据的"loc"属性所持有的更新位置
      document.getElementById("bindTwoWayData").textContent = data.loc.toString();
    }, "shift node");
  });
  shiftNode();  // initialize everything

图例:

您可以向 Binding.makeTwoWay 提供转换函数以从目标转到源。例如,要将位置表示为模型数据中的字符串而不是点,请执行以下操作:

// 点/大小/矩形/边距/点的存储表示是字符串,而不是对象:
new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify)

 注:不得在节点数据属性(即“键”属性)上具有 TwoWay 绑定。(默认为名称“key”,但实际上是Model.nodeKeyProperty的值。该属性值在模型内的所有节点数据中必须始终唯一,并且由模型已知。双向绑定可能会更改值,从而导致许多问题。同样,Node.key 属性是只读的,以防止意外更改键值。

官网建议不要使用双向绑定,至于原因,应该属于性能问题吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/361032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx 部署 Vue 项目以及 Vue 项目刷新出现 404 的问题(完整步骤)(亲测有效)

Nginx 部署 Vue 项目以及 Vue 项目刷新出现 404 的问题(完整步骤)(亲测有效) 1.流程步骤(本教程下载的是1.20.2版本,放在D盘) 1-1. 首先去官方下载 nginx ,然后在当前目录下创建ht…

大幅提升爬取效率的一款实用工具

在做爬虫的时候,我们往往可能这些情况:网站比较复杂,会碰到很多重复请求。有时候爬虫意外中断了,但我们没有保存爬取状态,再次运行就需要重新爬取。还有诸如此类的问题。那怎么解决这些重复爬取的问题呢?大…

什么国产蓝牙耳机颜值高又好用?好用且高颜值蓝牙耳机推荐

随着蓝牙耳机的受欢迎程度加深,其受众群体也越来越多样。什么国产蓝牙耳机颜值高又好用?针对这个问题,我来给大家推荐几款好用且颜值高的蓝牙耳机,可以当个参考。 一、南卡小音舱蓝牙耳机 参考价:239 蓝牙版本&…

Go进阶(3):上下文context

一、背景 在 Go http包的Server中,每一个请求在都有一个对应的 goroutine去处理。请求处理函数通常会启动额外的goroutine用来访问后端服务,比如数据库和RPC服务。一个上游服务通常需要访问多个下游服务,比如终端用户的身份认证信息、验证相关…

【网工最关心的问题,看Chat GPT怎么回答?】

最近打开微信群聊,都是在说ChatGPT相关内容 那ChatGPT是什么? ChatGPT是由美国人工智能实验室OpenAI开发的一个对话AI模型,于2022年11月正式推出。它因其极其出色的文本生成和对话交互能力在世界范围内迅速走红,五天内用户破百万&…

19岁就患老年痴呆!这些前兆别忽视!

在大部分人的印象中,阿尔兹海默症好像是专属于老年人的疾病,而且它的另一个名字就是老年痴呆症。然而,前不久,一位19岁的男生患上了阿尔兹海默症,是迄今为止最年轻的患者。这个男生从17岁开始,就出现了注意…

return和finally执行顺序、运行时异常与一般异常异同、error和exception区别、Java异常处理机制原理与应用

文章目录1.try {}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?2.运行时异常与一般异常有何异同?3.java 程序中的错误有三种类型分别是什么4.error和exception有什么…

GitHub推送报错:You‘re using an RSA key with SHA-1, which is no longer allowed

文章目录1、问题描述2、解决方案:重新生成密钥对3、将生成的公钥添加到GitHub4、向GitHub推送代码测试1、问题描述 在向GitHub推送代码的时候,执行git push命令出现如下问题: 原因是github不再支持RSA算法生成的密钥了,我们需要重…

《爆肝整理》保姆级系列教程python接口自动化(二十)--token登录(详解)

简介 为了验证用户登录情况以及减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。有些登录不是用 cookie 来验证的,是用 token 参数来判断是否登录。token 传参有两种一种是放在请求头里,本质上是跟 cookie 是一样的&…

微机原理学习总结0:前言

近期结束了微机课程的学习,(指刚考完试),正常情况下,后面应该不会再接触这门课程了,故在此记录自己这段时间的收获。 首先,十分推荐b站的一门课程,老师讲的很细致,很适合…

21个有用的python工具

Python是最流行的编程语言之一。 它简单、强大,并且由一个致力于开源项目的社区驱动。Python的大量使用是它如此流行的原因; 您可以免费构建软件、开发Web服务、执行数据分析和可视化以及训练机器学习模型。 Python开发工具 开发工具帮助我们构建快速可靠的Python…

生物素点击试剂1884349-58-9,Alkyne-PEG3-Biotin Diazo,炔基PEG3生物素重氮

Diazo Biotin-PEG3-alkyne,Alkyne-PEG3-Biotin Diazo,重氮生物素-PEG3-炔烃,重氮生物素PEG3炔烃,炔基PEG3生物素重氮产品结构式:产品规格:1.CAS号:1884349-58-92.分子式:C39H53N7O9S…

HANA SDA-远程数据源访问

我们需要把其他系统的数据拿过来,到BW里和财务的数据集成。 HANA SDA就是不复制数据,建立虚拟表(virtual table)来映射到远程数据源。通过这个虚拟表访问其他系统的数据。 对虚拟表的操作现在也可以查询,更新&#xff…

熵权法计算权重

文章目录1. 多属性决策问题2. 熵(entropy)3. 信息熵4. 熵权法5. 熵权法的实现基于信息论的熵值法是根据各指标所含信息有序程度的差异性来确定指标权重的客观赋权方法,仅依赖于数据本身的离散程度。熵用于度量不确定性,指标的离散…

LeetCode-Kotlin-Array-EASY-21至30题

关键字 PriorityQueuePairHashMap和HashSet的区别 1.HashMap实现了Map接口,而HashSet实现了Set接口。2.HashMap用于存储键值对,而HashSet用于存储对象。3.HashMap不允许有重复的键,可以允许有重复的值。HashSet不允许有重复元素。4.HashMap…

新库上线 | CnOpenData专精特新“小巨人”企业工商注册基本信息数据

专精特新“小巨人”企业工商注册基本信息数据 一、数据简介 “专精特新”一词最早来源于2011年7月,由时任工信部总工程师朱宏任在《中国产业发展和产业政策报告(2011)》新闻发布会上首次提出。“专精特新”是指具备专业化、精细化、特色化、…

第三届区块链服务网络(BSN)全球合作伙伴大会在杭州成功举办

为持续推动分布式技术和产业创新发展,2023年2月17日,由杭州市人民政府指导,杭州市拱墅区人民政府、国家信息中心主办,中国移动通信集团有限公司、区块链服务网络(BSN)发展联盟承办,中国移动通信…

如何在六秒内吸引观众的注意力

根据《2022国民专注力洞察报告》显示,当代人的连续专注时长,已经从2000年的12秒,下降到了现在的8秒。对于这个事实你可能难以相信,实际上这意味着,大多数互联网用户跳到一些页面上时,可能眼皮都不眨一下就离…

通过finalshell远程连接Windows中linux虚拟机

在Windows系统中安装Linux虚拟机,在日常使用中跨系统会造成很多不便,以finalshell为媒介,连接windows和linux虚拟机,方便日程练习,具体安装过程如下: 一、 安装finalshell 安装链接: https://…

Linux 配置网卡(基础配置、网卡会话配置、网卡绑定配置)

目录 配置网卡基本信息 通过nmcli命令配置网卡 通过配置网卡文件配置网卡 通过nmtui命令配置网卡 通过nm-connection-editor命令配置网卡 网卡高级配置 配置网络会话 配置网卡绑定(Bonding) 通过nmcli命令配置网卡绑定 nm-connection-editor 进…