我对knockoutjs来说相当新,因此存在很大的可能性,我只是不寻找合适的东西。
我有一个<select>
元素可以有多个选择。在加载时,我不想选择任何内容,但我不想在用户做任何事情之前向用户激活验证。如果选择和取消选择某些内容,或者清空所选数组的“无”按钮,我可以进行验证。这可以。我的<select>
看起来像这样:
<select multiple data-bind="options: PossibleValues,
selectedOptions: SelectedValues,
validationCore: SelectedValues">
</select>
就像我说的,如果我明确清空SelectedValues
,那么我会收到客户端验证消息。如果我不这样做,那么isValid()
将返回true,我看不到任何消息。
那么,如果它是空的,我怎样才能在提交时进行多项选择和失败验证,但是在加载时不将其突出显示为问题?
修改
我试图为我的问题简化我的示例,但基本上我有一个ViewModel,它有一个子ViewModel,并且该子对象是一个ko.observable()
,也是一个ViewModel。然后它得到一个子对象,它是ViewModels的ko.observableArray()
。这个最低级别是我试图查看验证错误的地方(添加{ deep: true }
只会因为太深而大叫)。问题是最低级别 - 我们称之为greatgrandchildVM
- 当我调用isValid()
时返回true,尽管非常明显无效。循环遍历greatgrandchildVM
的数组允许我看到errors()
中包含值。
为什么这些没有冒泡并将isValid()
抛向假?显然,我可以通过一个for循环来共同遍历我的greatgrandchildVM
数组并自己完成,但是我猜测有一种淘汰方式可以做到这一点而且我还太新,不知道它。 / p>
答案 0 :(得分:0)
这是选择元素的一个非常常见的问题。
将SelectedValues设置为空后执行以下操作:
SelectedValues.isModified(false);
那应该解决它
答案 1 :(得分:0)
尝试使用this syncModified extender。
传播强制验证并重置
如果拥有复杂的数据结构,则使用ko.validation.group 深沉:真实往往是一个重大的痛苦。另一方面, 复杂的数据结构可能还包括数组和对象 需要验证。
注意:这是一个扩展程序,而不是验证规则。
答案 2 :(得分:0)
使用'optionsCaption'绑定
<select multiple data-bind="options: PossibleValues,
selectedOptions: SelectedValues,
validationCore: SelectedValues,
optionsCaption: 'emptyValueText'">
</select>
这会添加一个空值,当没有选择值时显示emptyValueText
。
如果没有指定optionsCaption,则淘汰赛只会选择你的第一个
PossibleValues
,然后继续验证选择。
optionsCaption也可以是一个可观察的,或者只是一个空字符串
希望这有帮助