antvx6 开始和结尾不能互连



在使用 AntV X6 时,如果你希望**开始节点**和**结束节点**的连接桩不能互相连接,可以通过 `validateConnection` 函数来限制特定节点之间的连线行为。

### 实现步骤:

1. **设置连接桩规则**:在定义连线规则时,可以使用 `validateConnection` 函数来判断连接是否符合要求。
2. **判断节点类型**:通过 `source` 和 `target` 获取连接的起点和终点节点,然后判断它们的类型。
3. **返回布尔值**:如果满足条件返回 `true`,表示允许连接;否则返回 `false`,表示禁止连接。

### 示例代码

```javascript
import { Graph } from '@antv/x6'

// 创建画布
const graph = new Graph({
  container: document.getElementById('container'),
  width: 800,
  height: 600,
  // 连接相关的配置
  connecting: {
    // 连接桩是否可用
    anchor: 'center',
    // 设置连接器
    connector: 'smooth',
    // 验证连接是否有效
    validateConnection({ sourceCell, targetCell }) {
      // 判断开始节点是否连接到结束节点
      if (sourceCell && targetCell) {
        const sourceType = sourceCell.getData().type
        const targetType = targetCell.getData().type

        // 假设 type 为 'start' 表示开始节点,'end' 表示结束节点
        if (sourceType === 'start' && targetType === 'end') {
          return false  // 禁止开始节点连接到结束节点
        }
        if (sourceType === 'end' && targetType === 'start') {
          return false  // 禁止结束节点连接到开始节点
        }
      }
      return true  // 允许其他连接
    }
  }
})

// 添加开始和结束节点
const startNode = graph.addNode({
  x: 50,
  y: 100,
  width: 80,
  height: 40,
  label: '开始节点',
  data: { type: 'start' }  // 定义节点类型
})

const endNode = graph.addNode({
  x: 400,
  y: 100,
  width: 80,
  height: 40,
  label: '结束节点',
  data: { type: 'end' }  // 定义节点类型
})
```

### 说明:
1. **`validateConnection` 回调函数**:这是连线时用于验证连接是否符合规则的函数。参数中 `sourceCell` 是起始节点,`targetCell` 是目标节点。通过它们可以拿到节点的相关数据。
   
2. **`type` 属性**:在节点的 `data` 中定义了节点类型,比如 `start` 表示开始节点,`end` 表示结束节点。在 `validateConnection` 中通过 `getData().type` 获取节点的类型。

3. **连接规则**:当 `sourceType` 为 `'start'` 且 `targetType` 为 `'end'` 或者相反时,返回 `false`,表示禁止连接。

### 扩展:
- 你可以根据需求进一步扩展,比如限制其他类型节点之间的连接,或者限制某些特定的方向(例如只能从左到右连接)。
- 你还可以针对特定的连接桩(`port`)来添加更多的限制。

通过这种方式,你可以灵活地控制不同节点之间的连接行为,避免不符合业务规则的连接操作。

-----------------------------------------------------------------------------------------
<template>
  <div>
    <!-- 循环渲染多个下拉框 -->
    <div v-for="(item, index) in dropdowns" :key="index" class="dropdown-container">
      <el-select
        v-model="selectedValues[index]"
        placeholder="请选择"
        style="width: 200px;"  <!-- 这里设置下拉框的宽度,可以动态调整 -->
      >
        <!-- 循环渲染选项 -->
        <el-option
          v-for="option in options"
          :key="option.value"
          :label="option.label"
          :value="option.value"
        ></el-option>
      </el-select>
    </div>

    <!-- 提交按钮,用于获取所有下拉框的值 -->
    <el-button type="primary" @click="getAllValues">获取所有下拉框值</el-button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      // 下拉框选项数组
      options: [
        { value: 'Option1', label: '选项1' },
        { value: 'Option2', label: '选项2' },
        { value: 'Option3', label: '选项3' },
      ],
      // 存储下拉框选中的值
      selectedValues: [],
      // 用于循环生成的下拉框数量(也可以是对象)
      dropdowns: Array(5).fill(null),  // 假设生成 5 个下拉框
    };
  },
  methods: {
    // 获取所有下拉框的值
    getAllValues() {
      console.log(this.selectedValues);  // 打印所有下拉框的值
    },
  },
};
</script>

<style scoped>
/* 自定义样式 */
.dropdown-container {
  margin-bottom: 10px;
}
</style>
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


在 JavaScript 中,如果你有一个对象和一个数组对象,并想要查找它们之间相同的数据,可以通过多种方法来实现。常见的场景是比较对象的某个属性值与数组中对象的某个属性值是否相同。

### 假设场景:
- 你有一个对象 `obj`。
- 你有一个数组 `arr`,数组中的每个元素都是对象。
- 你想要查找 `arr` 中的对象,其属性值与 `obj` 的某个属性值相同。

### 示例数据:
```javascript
// 对象
const obj = {
  id: 1,
  name: 'Alice',
  age: 25
};

// 数组对象
const arr = [
  { id: 1, name: 'Bob', age: 30 },
  { id: 2, name: 'Alice', age: 25 },
  { id: 3, name: 'Charlie', age: 25 }
];
```

### 查找相同数据的方式:

#### 1. **比较对象的某个属性值与数组中对象的某个属性值**

如果你想查找数组 `arr` 中与对象 `obj` 某个属性值相同的元素,比如比较 `name` 属性,可以使用 `Array.prototype.filter` 来筛选出符合条件的元素。

```javascript
const result = arr.filter(item => item.name === obj.name);
console.log(result);
```

**输出:**
```javascript
[
  { id: 2, name: 'Alice', age: 25 }
]
```

上面的代码查找了 `arr` 中 `name` 属性与 `obj` 的 `name` 相同的对象。

#### 2. **比较多个属性**

如果你需要比较多个属性(如 `name` 和 `age`),可以在 `filter` 中比较多个属性。

```javascript
const result = arr.filter(item => item.name === obj.name && item.age === obj.age);
console.log(result);
```

**输出:**
```javascript
[
  { id: 2, name: 'Alice', age: 25 }
]
```

在这个例子中,我们查找了 `arr` 中同时满足 `name` 和 `age` 都与 `obj` 相同的对象。

#### 3. **查找第一个匹配的对象**

如果你只想查找第一个匹配的对象,而不是所有匹配的对象,可以使用 `Array.prototype.find`。

```javascript
const result = arr.find(item => item.name === obj.name && item.age === obj.age);
console.log(result);
```

**输出:**
```javascript
{ id: 2, name: 'Alice', age: 25 }
```

这里返回了 `arr` 中第一个符合条件的对象。

#### 4. **动态比较属性**

如果你想根据对象的属性动态地进行比较,比如需要比较 `obj` 和 `arr` 中的所有共有属性是否相同,可以使用 `Object.keys` 来遍历对象的键。

```javascript
const result = arr.filter(item => {
  return Object.keys(obj).every(key => item[key] === obj[key]);
});
console.log(result);
```

**输出:**
```javascript
[
  { id: 2, name: 'Alice', age: 25 }
]
```

在这个例子中,代码动态地比较了 `obj` 和 `arr` 中对象的所有共有属性是否相等。

### 总结:
- `filter`:用于查找所有符合条件的数组元素。
- `find`:用于查找第一个符合条件的数组元素。
- 使用 `Object.keys` 和 `every` 可以实现动态属性比较。

你可以根据具体需求选择不同的方式进行对象和数组对象的比较。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值