我的entityState上的ko.computed observable不是动态的

时间:2013-08-22 09:55:59

标签: knockout.js breeze

我在我的asp.net mvc项目中使用Breeze。

我定义了以下计算函数:

var isDetached = ko.computed(function () {
    if (rolling())
        return rolling().entityAspect.entityState.isDetached();
});

实体首次添加然后(立即)取消时为detached(<1}}。

基本情景:

  • (1)创建一个新的&#39;
  • &GT;&GT; entityState被添加&#39;
  • (2)取消创建操作(datacontext.cancelChanges)
  • &GT;&GT; entityState是&#39; Detached&#39;

问题:当我尝试从我的计算出的挖掘可观察量中获取entityState.isDetached()的值时,该值似乎不是动态的。从上一个基本场景开始,在步骤1之后,ko.computed isDetached()为false(因为它已被添加)。在第2步之后,ko.computed仍然是假的,但它应该是真的。

如果我明确地得到这样的值,它就有效:

if (rolling().entityAspect.entityState.isDetached())
    ...

我知道为什么我的ko.computed不是动态的?

感谢。

2 个答案:

答案 0 :(得分:1)

只有当Knockout检测到计算出的observable中使用的值发生了变化时,才会重新评估计算的observable。 Knockout只能检测可观察量的变化。如果你在计算的observable中使用一个不是可观察的变量,并且该变量改变了它的值,那么Knockout将不会检测到它。

要使计算的observable起作用,其中使用的所有变量(可能会改变值)必须是可观察的。

答案 1 :(得分:0)

aaberg基本上是正确的。当然,您可以在计算中包含其他变量,但KO不会检测到它们已经发生变化......这是他的观点......以及问题的根源。

entityAspect及其属性不是可观察的。这是一个设计决定,而不是偶然的遗漏。

如果我了解您如何使用这些信息,我可以推荐一种方法。当EntityState发生变化时会发生什么?