将新项添加到knockout中的validatedObservable

时间:2015-03-05 13:43:31

标签: knockout.js knockout-validation

假设我有一个经过验证的可观测量,并且里面有一个扩展的可观察量。 这很好。

  var validationModel = ko.validatedObservable([
    model.text1.extend({required: true})
  ]);

如果我然后添加到这个validatedObservable的数组,我希望它现在知道新的验证,但事实并非如此。

  validationModel().push(
    model.text2.extend({required: true})
  );

是否可以在不重新初始化validationModel的情况下将验证扩展到新的observable?

我尝试使用model.text2.notifySubscribers(),并且触发验证消息中的这种工作。但是isValid()仍然显示为真。

这是一个显示我在说什么的工作示例:

http://liveweave.com/MBq7XU

2 个答案:

答案 0 :(得分:1)

我一直在寻找源代码,我能看到的唯一方法是传入一个新数组。鉴于我想要添加旧数组,这是我能想到的最优雅的事情。

  validationModel(ko.utils.arrayPushAll(validationModel(),
    [model.text2.extend({required: true})]
  ));

http://liveweave.com/sUxgeO


不工作?

事实证明我使用的是旧版验证(来自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);