具有端口和工具项(删除、设置等)的 JointJS 元素

2023-11-29

我设法通过端口增强我的 SVG 形状:

joint.shapes.devs.Element = joint.shapes.basic.Generic.extend(_.extend({},     
joint.shapes.basic.PortsModelInterface, {
    // SVG markup with ports
});

这样我得到输出:

SVG shape with ports

我想用删除按钮增强这个形状。为此我有:

joint.shapes.devs.toolElement = joint.shapes.basic.Generic.extend({
    // markup for delete button
});

基于 Mike Goodwin 的解决方案如何给JointJS元素提供删除工具?

我的问题:如何将 PortModelInterface 与删除工具结合起来? 解决方案应该如下所示:

delete action and ports combined

谢谢你的协助。


Solution

关键是这个插件。作者使用自己的移动、调整大小和端口工具代码扩展了 PortsModelInterface。我通过实现删除功能进一步扩展了它。这样,开发模型在功能方面对任何扩展都是开放的。

它是如何完成的

In tooledViewPlugin.jsjoint.plugins.TooledModelInterface = {}。我在那里添加了:

deleteToolMarkup: '<circle fill="red" r="11"/><path transform="scale(.8) translate(-16, -16)" d="M24.778,21.419 19.276,15.917 24.777,10.415 21.949,7.585 16.447,13.087 10.945,7.585 8.117,10.415 13.618,15.917 8.116,21.419 10.946,24.248 16.447,18.746 21.948,24.248z"/><title>Remove this element from the model</title>',

下面在joint.plugins.TooledViewInterface = {} I wrote

renderDeleteTool: function () {
    var deleteContainer = this.$('.deleteTool').empty();
    var markup = V(this.model.deleteToolMarkup);
    for(var id in markup)
        deleteContainer.append(markup[id].node);
}

具有除简单矩形之外的特殊 SVG 标记的示例形状。请注意<g class="deleteTool"/>在标记中:

joint.shapes.devs.UnspecifiedProcess = joint.shapes.devs.Model.extend(_.extend({}, joint.plugins.TooledModelInterface, {

markup: ['<g class="rotatable">',
            '<g class="scalable">',
                '<rect class="body"/>',
                '<g xmlns="http://www.w3.org/2000/svg" transform="translate(-549.49953,-824.87393)" id="layer1">',
                    '<g transform="matrix(0.933025,0,0,-0.2986125,549.49953,846.37362)" id="g3553">',
                      '<g transform="scale(0.98976,3.0047)" id="g3555">',
                        '<g clip-path="url(#clipPath3559)" id="g3557">',
                          '<path d="m 57.805,0.90155 -57.805,0 0,23.06045 57.805,0 L 72.244,12.432 57.805,0.90155 z" id="path3563" style="fill:#b8cde8;fill-opacity:1;fill-rule:evenodd;stroke:none"/>',
                        '</g>',
                      '</g>',
                    '</g>',
                '</g>',
            '</g>',
            '<g class="inPorts"/>',
            '<g class="outPorts"/>',
            '<g class="moveTool"/>',
            '<g class="resizeTool"/>',
            '<g class="portsTool"/>',
            '<g class="deleteTool"/>',
            '<title class="tooltip"/>',
        '</g>'].join(''),

defaults: joint.util.deepSupplement({
    type: 'devs.UnspecifiedProcess',
    inPorts: [''],
    outPorts: [''],
    moveTool: true,
    resizeTool: true,
    size: { width: 100, height: 31},
    attrs: {
        '.inPorts circle': { fill: '#fff' },
        '.outPorts circle': { fill: '#fff' },
        '.body': {
            width: 67, height: 21,
            stroke: 'none'
        },
    }
}, joint.shapes.devs.Model.prototype.defaults),
}));
joint.shapes.devs.UnspecifiedProcessView = joint.shapes.devs.ModelView.extend(joint.plugins.TooledViewInterface);

最后一部分是实例化元素new joint.shapes.devs.UnspecifiedProcess。我用拖放逻辑向您展示它,因为它可能对您也有用:

//Drag and drop shapes
if (Modernizr.draganddrop) {
    // Mouse position
    var posX = 0,
        posY = 0;
    // Selected Element with start of dragging
    var selectedEl = "";
    var selectedObj = null;
    var oldObj = null;
    //
    $(".draggable-svg").on("dragstart", function(e) {
        selectedEl = this.id;
        console.log(selectedEl);
    }); 
    $("#drawing-area").on("dragover", function(e) {
        e.preventDefault();
        posX = e.originalEvent.pageX - sideBarW;
        posY = e.originalEvent.pageY - topBarH;
    }); 
    $("#drawing-area").on("drop", function(e) {
        e.preventDefault();
        var element = new joint.shapes.devs[selectedEl]({
            position: { x: posX, y: posY }
        });
        graph.addCell(element);
        selectedEl = "";
        oldObj = selectedObj;
        selectedObj = element;

    }); 
} else {
    alert("Your browser is very old. Please update.");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有端口和工具项(删除、设置等)的 JointJS 元素 的相关文章

  • backbone.js - 如何在视图之间进行通信?

    我有一个带有多个backbone js 视图的单页Web 应用程序 观点有时必须相互沟通 两个例子 当有两种方式视图同时以不同方式呈现集合时 并且对一个视图中的项目的点击必须转发到另一个视图 当用户转换到流程的下一个阶段时 第一个视图将数据
  • Backbone.js 模型默认值和解析

    我有这个Backbone Model代表 Google Books API 卷 var Book Backbone Model extend defaults volumeInfo title n a authors n a publish
  • 如何定义与 Backbone 一起使用的 jade 模板

    我需要使用模板来渲染每个 ItemView var ItemView Backbone View extend className item template template itemTemplate html initialize fu
  • 从左到右显示 SVG 动画

    我有两个 SVG 图像 我想将它们设置为动画 如下所示 首先显示Full Screen文本从左到右 然后用第二个 SVG 覆盖该单词Screen显示整个第二个 SVG 因此 最后我将得到第二个 svg 中的单词 Full 黑色空间 以及单词
  • 使用 html2canvas 将 highcharts 图表渲染为 pdf 在 IE 和 Firefox 上不起作用

    我们使用 html2canvas js 和 html2canvas svg js 版本 0 5 0 beta1 以及 highcharts js 将圆环图下载为 pdf 这在 Chrome 中按预期工作 但在 IE 和 Firefox 中不
  • 对周围的所有 Node JS 框架/库等感到困惑 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我感觉有点困惑 有很多 Node js 相关 东西 的框架 有人能给我一个概述吗 以下库 框架 其他内容如何相互关联 交互 其中包括什么或
  • 如何将参数传递给backbone.js 中事件对象中绑定的函数

    我需要为 Backbone 中的事件对象中使用的函数提供参数 var DocumentRow Backbone View extend tagName li className document row events click icon
  • 如何在不违反 MVVM 的情况下绑定到不可绑定的属性?

    我在用SharpVector 的 SvgViewBox https sharpvectors codeplex com 显示静态资源图像 如下所示
  • Backbone-relational 无法实例化两个 RelationalModel 对象

    我正在尝试实现 BackboneRelational 并不断获得 无法实例化多个 Backbone RelationalModel 每种类型都有相同的 ID class App Models User extends Backbone Re
  • backbone.js + require.js + 用户认证

    开始学习backbone js和require js 不确定如何通过用户身份验证构建 Web 应用程序的文件 看起来应该是这样的 On app init query server to check auth session state Q
  • 使用 d3 进行多级/分组轴标签

    我想知道是否有一种简单的方法可以在 d3 中添加多级 分层 分组轴标签 例如 如果我有一个折线图 其中 x 轴的月份名称跨越多年 那么我还希望将年份作为月份名称下方的标签 因此它看起来像这样 Oct Nov Dec Jan Feb Mar
  • 为什么媒体查询中的 CSS 旋转不会旋转回来

    我有一个 SVG 其中一些元素根据媒体查询进行旋转 如下所示 media max width 480px rect transform rotate 10deg 该元素旋转得很好 但 至少在 Chrome 中 它拒绝返回 这是为什么 其他指
  • SVG 捕获鼠标坐标

    我知道之前已经有人问过有关 svg 鼠标坐标的问题 但我对我当前遇到的行为感到非常困惑 而且似乎没有一个线程能够解决它 我用于捕获坐标的方法 var pt svg createSVGPoint Created once for docume
  • SVG 图标像素对齐?

    在此图像中 左侧 黑色 垃圾桶是图标字体 它的字体大小是 16px 这使得图标在 100 的时间里看起来都很清晰 两个蓝色垃圾桶是 SVG 它们具有完全相同的标记 其中之一happened一个是像素对齐的 另一个不是 我怎样才能强制我的 S
  • 分配函数后如何删除 onmouseout 事件?

    我有一个问题 我正在为 onmouseout 事件分配一个函数 但运行该事件后 我需要将其删除 将非常感谢您的帮助 这取决于你的代码 如果你用 d3 这样做 那么你可以说 在 onmouseout 事件函数中 element on mous
  • SVG 中三角形的圆角

    我正在尝试制作一个具有圆角的三角形 三角形将如下所示 左下角是唯一看起来相当容易制作的角 主要是因为这是一个 90 度的 转弯 该转弯是使用QSVG 中的命令具有以下参数 Q x y height x y height RADIUS从我正在
  • SVG 文本无法在 Chrome 或 Safari 中呈现

    我有一些 SVG 文本在 Firefox 上运行良好 但在 Chrome 和 Safari 中却没有出现 我努力了 向 svg 容器添加填充 以防文本被隔断 从文本中删除 xml space preserve 添加内联填充颜色
  • Safari 滚动条和 SVG

    问题 Safari 无法正常工作 而是使用滚动条渲染我的 SVG 图像 问题的改进版本 如何填充设定的宽度并根据 Safari 中的宽高比计算高度 感谢普罗格兹 相关代码 SVG File viewBox 0 0 800 800 未指定高度
  • 如何克隆骨干集合

    有没有办法轻松克隆 Backbone Collection 我想知道为什么没有像模型那样的内置方法 我的问题是我有一个模型包含一组孩子 当我克隆模型时 我仍然有子项的集合 但只有它们的默认值 最简单的方法 var cloned new Ba
  • d3.event.translate 在触摸设备的缩放上包含 NaN

    我使用 d3 为我的 svg 编写了一个自定义缩放函数 如下所示 Zoom behavior function myzoom xpos d3 event translate 0 ypos d3 event translate 1 vis a

随机推荐

  • 使用 async/await 时 GUI 冻结

    我试图找出下面的代码有什么问题 我认为使用 async 和 wait 让我忘记 GUI 问题 例如冻结 因为一些长代码阻塞了主线程 单击按钮后 GUI 会做出响应 直到调用longRunningMethod 如下所示 private asy
  • 保护远程 mysql 连接的安全

    我的处境很不幸 必须将本地 microsoft access 数据库与远程 mysql 数据库同步 我编写了一个 php 脚本 它将每 10 分钟同步一次数据库 但我绝对担心安全问题 到目前为止 我已经使用 cpanel 设置了远程 mys
  • 'NoneType' 对象在 BeautifulSoup 中没有属性 'text'

    当我搜索 时 我试图抓取谷歌结果 什么是2 2 但返回以下代码 NoneType object has no attribute text 请帮助我实现所需的目标 text What is 2 2 search text replace l
  • 如何处理for循环中路径名中的空格?

    尝试使用当前脚本的路径 并且该路径中包含空格 但我似乎无法让它工作 C Test Directory gt dir Volume in drive C has no label Volume Serial Number is 7486 CE
  • 自动滚动到页面底部然后顶部并重复

    我创建了一个仪表板 它会回显所有行 但我想要一个自动滚动 它会慢慢地向下滚动到页面底部 然后慢慢地滚动回顶部并重复 我已经用谷歌搜索了这个 但无法获得有效的代码 我一直在寻找 jQuery 代码 但任何东西都可以 因为页面会一直调整 所以不
  • 在 C++ 中从给定的种子生成相同的随机数序列

    我正在使用 mt19937 从给定种子生成随机字符串 如下所示 std string StringUtils randstring size t length uint64 t seed static auto chrs abcdefghi
  • 单击react-native中的菜单项时如何打开页脚选项卡屏幕之一?

    我正在创建一个反应本机应用程序 现在我想在单击菜单项时打开页脚选项卡屏幕之一 在这里 我附上了我的示例屏幕 可以从中清楚地了解我的问题 这是我的 GitHub 存储库 https github com SidathDananjaya Eve
  • 使用 C++ 编程时,如何在 win32 中创建子窗口?

    我是 C 以及 Windows 编程的新手 我使用 msdn 创建了一个窗口CreateWindow 功能 其工作正常 现在我想创建一个子窗口 父窗口应该控制子窗口 任何有关此的帮助示例代码 提前致谢 粗略地说 在父级的处理程序中 您希望创
  • 数组的元素类型不完整。这是什么意思? [复制]

    这个问题在这里已经有答案了 我想创建一个数组来存储任何整数 n 的乘法值 之后 我想将该数组传递给另一个函数并打印出该数组 但是 我收到以下错误 My code 这是我的 c 文件 include multiplication h incl
  • Windows 上的 LDAP 身份验证

    我安装了 64 位 Windows 平台和 Postgresql 8 4 作为 Apache EnterpriseDB ApachePHP 安装在 Pstgres 上 我需要使用 Active Directory 或 LDAP 凭据对系统进
  • 使用 C# 从另一个表单获取值[重复]

    这个问题在这里已经有答案了 如何从一种形式获取另一种形式的值 我已经尝试过以下方法 但它不起作用 Form1 public TextBox TXT get return txtbox1 Form2 public Form1 frm txtb
  • iOS 中的 UILocalNotification 中不显示操作和类别

    我相信苹果文档中有以下内容here我只需要一个类别UILocalNotification BOOL application UIApplication application didFinishLaunchingWithOptions NS
  • Heroku 项目中带有 Python 模块的 Node 应用程序未安装

    我有一个部署到 Heroku 的 Node Express 服务器 项目 运行良好 但我编写了一个小型 Python 模块 不需要服务器或新的 Heroku 实例 但它需要从 pip 安装一些第 3 方包 我的问题是 虽然 Python 似
  • 如何修复“pandas.core.common”没有属性“AbstractMethodError”?

    我想看看 pandas 对象可用的方法 当我运行此代码时 出现 AttributeError 错误 我已经搜索过 但没有找到此错误的示例或如何修复它 for i in df jobs groupby group failed failed
  • 如何使用 Selenium WebDriver 和 Java 将鼠标悬停在 Web 元素上

    如何使用 Selenium Webdriver 执行鼠标悬停功能 测试用例就像是说 打开雅虎网站 登录旁边有链接 邮件 鼠标悬停时 它将显示工具提示 当我尝试下面的代码时 鼠标不是悬停在确切的位置 而是悬停在其他地方 我哪里出错了 另外让我
  • Java错误:无法对非静态方法进行静态引用

    我正在编写一个 Android 应用程序并收到此错误 但我不知道为什么 有人可以帮助我理解为什么我会收到此错误吗 Cannot make a static reference to the non static method updateS
  • 具有已定义迭代器的 C# for 循环

    我想使用已经定义的迭代器创建一个循环 目前我正在使用 int i while i lt 10 Console Writeline i i 这很丑陋 因为其他人稍后可能会删除 i 如果它和 while 语句被一大块代码隔开 就不清楚它的用途了
  • Android Studio 使用 Java 8 而不是 11

    我尝试导入的应用程序中的 gradle 版本与 JDK11 不兼容 而 android studio 使用 JDK11 作为其嵌入式 JDK 我的机器上有 JDK8 我尝试进入项目结构来更改 JDK8 位置的路径 但如果尝试更改它 则会出现
  • 原型继承的淘汰问题

    我在 Knockout 中遇到了一个问题 我在原型中创建了一个用户对象 其中对象的可观察属性似乎被最后一次出现的情况覆盖 因此我不能多次使用同一个对象 否则它将被覆盖 虽然这很难解释 但请看我的小提琴 http jsfiddle net R
  • 具有端口和工具项(删除、设置等)的 JointJS 元素

    我设法通过端口增强我的 SVG 形状 joint shapes devs Element joint shapes basic Generic extend extend joint shapes basic PortsModelInter