Knockout.js 在我的实体状态上可观察到的ko.computed不是动态的

Knockout.js 在我的实体状态上可观察到的ko.computed不是动态的,knockout.js,breeze,Knockout.js,Breeze,我在asp.NETMVC项目中使用Breeze 我定义了以下计算函数: var isDetached = ko.computed(function () { if (rolling()) return rolling().entityAspect.entityState.isDetached(); }); 一个实体在第一次添加然后(立即)取消时被分离 基本情景: (1) 创建一个新的“滚动” >>entityState为“已添加” (2) 取消创建操作(datacon

我在asp.NETMVC项目中使用Breeze

我定义了以下计算函数:

var isDetached = ko.computed(function () {
    if (rolling())
        return rolling().entityAspect.entityState.isDetached();
});
一个实体在第一次添加然后(立即)取消时被分离

基本情景:

  • (1) 创建一个新的“滚动”
  • >>entityState为“已添加”
  • (2) 取消创建操作(datacontext.cancelChanges)
  • >>实体状态为“分离”
问题:当尝试从我计算的敲除观察值中获取
entityState.isDetached()的值时,该值似乎不是动态的。根据前面的基本场景,在步骤1之后,ko.computed
isDetached()
为false(因为它已添加)。在步骤2之后,ko.computed仍然为false,但应该为true

如果我显式地获得如下值,它就会起作用:

if (rolling().entityAspect.entityState.isDetached())
    ...
知道为什么我的ko.computed不是动态的吗


谢谢。

只有当敲除检测到计算的可观察值中使用的值已更改时,才会重新评估计算的可观察值。敲除只能检测观察到的变化。如果您在计算的可观察对象中使用了一个非可观察的变量,并且该变量改变了其值,那么Knockout将不会检测到它


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

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

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


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

当EntityState更改时,不会发生任何事情。但当用户单击“取消”按钮时,如果实体已分离(添加的实体在取消后变为分离的实体),则我希望返回列表(导航回)。对于我的案例,一个简单的解决方案是使用一个名为
isDetached
的简单函数,而不是一个计算的可观测值。我同意你的解决方案,并且希望它比计算的可观测值更好:-)