假设我有一个经过验证的可观测量,并且里面有一个扩展的可观察量。 这很好。
var validationModel = ko.validatedObservable([
model.text1.extend({required: true})
]);
如果我然后添加到这个validatedObservable的数组,我希望它现在知道新的验证,但事实并非如此。
validationModel().push(
model.text2.extend({required: true})
);
是否可以在不重新初始化validationModel的情况下将验证扩展到新的observable?
我尝试使用model.text2.notifySubscribers()
,并且触发验证消息中的这种工作。但是isValid()
仍然显示为真。
这是一个显示我在说什么的工作示例:
答案 0 :(得分:1)
我一直在寻找源代码,我能看到的唯一方法是传入一个新数组。鉴于我想要添加旧数组,这是我能想到的最优雅的事情。
validationModel(ko.utils.arrayPushAll(validationModel(),
[model.text2.extend({required: true})]
));
事实证明我使用的是旧版验证(来自nuget)。这个版本实现了validatedObservable,产生了一些副作用。
因此我最终不得不使用此代码来实现我所需要的。
kovalidation.pushValidation = function (validatedObservable, itemsArray)
{
var newValidatables = ko.utils.arrayPushAll(validatedObservable(), itemsArray);
validatedObservable(newValidatables);
validatedObservable.errors = kovalidation.group(newValidatables);
};
可以像:
一样使用 kovalidation.pushValidation(validationModel,
[model.text2.extend({required: true})]
));
答案 1 :(得分:1)
经过一些更广泛的调查后,我不相信我以前的答案是完全正确的,因为它忽略了validatedObservable
内的基础订阅。
因此我得出的结论是,最好建立一个数组,然后只有在拥有所有内容时才初始化ko.validatedObservable([..wholearray..])
。
如果你真的必须添加到已经存在的validatedObservable
,我认为你唯一的选择是拔出阵列,然后重新初始化它。
var validationModel = ko.validatedObservable([...])
var underlyingArray = validationModel();
underlyingArray.concat([...]);
validationModel = new ko.observable(underlyingArray);