【发布时间】:2025-12-19 00:35:06
【问题描述】:
免责声明:这是我第一次尝试构建 MVVM 应用程序,我之前也没有使用过 vue.js,所以很可能我的问题是由更基本的问题引起的。
在我看来,我有两种带复选框的块:
- 类型 1:块/复选框
- 类型 2:块/标题/复选框
底层对象的结构如下:
{
"someTopLevelSetting": "someValue",
"blocks": [
{
"name": "someBlockName",
"categryLevel": "false",
"variables": [
{
"name": "someVarName",
"value": "someVarValue",
"selected": false,
"disabled": false
}
]
},
{
"name": "someOtherBlockName",
"categryLevel": "true",
"variables": [
{
"name": "someVarName",
"value": "someVarValue",
"categories": [
{
"name": "SomeCatName",
"value": "someCatValue",
"selected": false,
"disabled": false
}
]
}
]
}
]
}
我的目标
选中复选框:
- 用户点击复选框,复选框被选中 (selected=true)
- 触发一个方法来检查是否需要禁用任何其他复选框 (disabled=true)。 (如果此方法确实禁用了任何东西,它还会再次调用自身,因为其他项目可能反过来依赖于禁用的项目)
- 另一种方法更新一些其他内容,例如图标等
清除复选框
用户可以单击“清除”按钮,取消选中列表中的所有复选框 (selected=false)。此操作还应触发可选择禁用复选框和更新图标等的方法。
我目前的方法 (看起来不太正确)
- 数据模型的选定属性绑定到选中的
复选框元素的状态通过
v-model指令。 - 禁用属性(来自模型)绑定到元素的类和禁用属性。该状态由上述方法设置。
- 为了初始化禁用复选框和更改某些图标的方法,我使用了
v-on="change: checkboxChange(this)"指令。 我认为我需要以不同的方式完成这部分 - clearList 方法通过
v-on="click: clearList(this)"调用
我当前设置的问题是当以编程方式清除复选框时(即不是通过用户交互),更改事件没有触发。
我想要什么
对我来说,最合乎逻辑的做法是使用 this.$watch 并跟踪模型的变化,而不是监听 DOM 事件。
一旦发生变化,我就需要确定哪个确切的项目发生了变化,然后采取行动。我试图创建一个观察blocks 数组的$watch 函数。这似乎很好地适应了变化,但它返回的是完整的对象,而不是已更改的单个属性。此对象还缺少一些方便的辅助属性,例如$parent。
我可以想出一些让应用程序正常工作的 hacky 方法(比如在我的 clearList 方法中手动触发更改事件等),但我的用例似乎很标准,所以我希望可能有一种更优雅的方式来处理这个。
【问题讨论】:
标签: javascript mvvm vue.js