0

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

我定义了以下计算函数:

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

一个实体detached(例如)当它第一次被添加然后(立即)被取消时。

基本场景:

  • (1)创建一个新的'滚动'
  • >> entityState 是“已添加”
  • (2)取消创建的操作(datacontext.cancelChanges)
  • >> entityState 是“分离”

问题:当试图entityState.isDetached()从我计算的淘汰赛 observable 中获取 的值时,该值似乎不是动态的。从前面的基本场景来看,在第 1 步之后,ko.computedisDetached()为 false(因为它是已添加的)。在第 2 步之后, ko.computed 仍然是假的,但它应该是真的。

如果我明确地得到这样的值,它会起作用:

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

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

谢谢。

4

2 回答 2

1

只有当 Knockout 检测到计算的 observable 中使用的值已更改时,才会重新评估计算的 observable。Knockout 只能检测 observables 的变化。如果您在计算的 observable 中使用了一个不是 observable 的变量,并且该变量更改了它的值,Knockout 将不会检测到它。

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

于 2013-08-22T12:40:00.860 回答
0

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

和它的entityAspect属性不是可观察的。这是一个设计决定,而不是随便的遗漏。

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

于 2013-08-23T01:05:07.857 回答