免责声明:这是我第一次尝试构建一个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
指令将数据模型的selected属性绑定到复选框元素的选中状态上。 - 从模型中绑定disabled属性到元素的class和disabled属性。此状态由上述方法设置。
- 为初始化禁用复选框和更改某些图标的方法,我正在使用
v-on="change: checkboxChange(this)"
指令。我认为我需要以不同的方式执行此部分。 - 通过
v-on="click: clearList(this)"
调用clearList方法。
我的当前设置存在的问题是,当以编程方式清除复选框时(即非用户交互),更改事件不会触发。
我希望的替代方案
对我来说,最合适的做法应该是使用this.$watch
并跟踪模型中的更改,而不是侦听DOM事件。
一旦有更改,我就需要确定哪个项目确切地发生了更改,并采取行动。我已尝试创建一个观察blocks数组的$watch函数。这似乎很好地检测到了更改,但它返回完整对象,而不是已更改的单个属性。此外,此对象缺少一些方便的辅助属性,例如$parent。
我可以想到一些笨拙的方法使应用程序正常工作(例如在我的clearList方法中手动触发更改事件等),但我的用例似乎非常标准,因此我预计可能有更优雅的处理方式。