2014-08-31 53 views
1

我有以下情形 - 我有一个属性,它具有触发验证程序的扩展名。相同的属性也是依赖/计算的可观测值的一部分。我需要计算的observable在验证器扩展触发之前先运行,因为它更新了验证器所需的一些值。然而,验证器总是首先触发。验证程序扩展之前计算可观察的敲除触发器

在我的模型 -

self.selected = ko.observable(false); 
self.selected.extend({ checkVal: { viewModel: self } }); 

在我的计算观察到的 -

self.mySelectedComputed = ko.computed({ 
    read: function() { 
       if self.selected()...//I do some updates here 
     } 
}); 

在我的验证 -

ko.validation.rules['checkVal'] = { 
    validator: function (val, parameter) { 

     var isSelected = parameter.viewModel.selected(); 
     if (isSelected) { 
      //some other checks here based on the values updated by the computed observable 
      return false; 
     } 
     return true; 
    }, 
    message: "Invalid.", 
    decorateInputElement: true 
}; 
+0

是否所有的值由计算的观测值更新?如果他们是那么当更新任何值时应该调用验证器。验证器本质上就像一个计算机。以http://jsfiddle.net/znnwozte/为例 – 2014-08-31 20:41:18

+0

谢谢!不,只更新了2个值。如果计算出来的观察值是坐在父级别上呢?当孩子“选择”可观察到的变化时,它需要触发吗? – 2014-09-01 07:10:04

+0

您是否可以更新您的示例以显示更新的所有其他值,并且正如Artur所提到的,这是一个用jsFiddle或jsBin来展示问题的示例应用程序。它真的帮助我们帮助你 – 2014-09-02 07:06:27

回答

0

看起来你在滥用计算观测。我认为没有办法明确定义计算的观测值的“更新顺序”。

如果在您的验证器中您需要应用一些初步逻辑,也许它会更容易在那里运行,而不依赖于可观察的副作用。另一方面:也许你在你的计算可观察代码中做的“更新部分”可以用一组可观察值来表示,在这种情况下,淘汰赛将处理整个依赖链。这是在视图模型中处理依赖关系的通常和“干净”的方式。

+0

我真的想避免在验证器中执行更新逻辑。我有2个观察对象,在选择更改时需要更新。这就是为什么我创建了一个依赖/计算的观察值。我还能怎么做到这一点? – 2014-09-01 07:22:11

+1

现在你以不同的方式陈述了你的问题(细节问题)。你能提供jsfiddle的最小例子吗?我相信我们确信我们可以解决您的问题,但您在问题中遗漏的细节可能至关重要。 – 2014-09-01 09:45:59