Knockout.js 是否可以将微风产生的可观测值重新定义为计算场?

Knockout.js 是否可以将微风产生的可观测值重新定义为计算场?,knockout.js,breeze,Knockout.js,Breeze,我可能没解释清楚 我使用breeze js实现一个实体,该实体包含近100个浮点字段。这些是计算结果字段,其中有4个单独的部分,然后是总数,重复19次。因此,19 x 5=95个字段,因此“接近100个” 基本上是: calculationResult1_materials calculationResult1_processes calculationResult1_packaging calculationResult1_transport calculationResult1_to

我可能没解释清楚

我使用breeze js实现一个实体,该实体包含近100个浮点字段。这些是计算结果字段,其中有4个单独的部分,然后是总数,重复19次。因此,19 x 5=95个字段,因此“接近100个”

基本上是:

calculationResult1_materials 
calculationResult1_processes 
calculationResult1_packaging 
calculationResult1_transport 
calculationResult1_total 

calculationResult2_materials 
calculationResult2_processes 
calculationResult2_packaging 
calculationResult2_transport 
calculationResult2_total 

calculationResult3_materials 
etc...
很明显,“总计”字段包含其他4个部分的总和,但也会存储,因为有一个传统系统只访问该字段,这防止了每次有人想要查看总计时都必须进行总和

正如其他字段一样,breeze将总字段具体化为一个简单的可观察字段,这意味着每次我为任何计算重新计算其他4个字段中的任何一个,我必须手动重新计算4个单独组成部分(材料、包装、工艺、运输)的总和,并将结果放入“总计”中observable,它绑定到显示它的html页面中的div

虽然这是可行的,但我觉得这可能不是最有效的做事方式。显然,我可以在viewmodel中独立创建19个ComputedObservable,其中包含每个计算的4个其他字段,然后绑定到该字段,而不是每个实际的“总计”observable,但这意味着如果字段名称发生更改,则需要手动更新代码


有没有办法将可观测数据重新定义为可计算的可观测数据,以便在计算的其他4个部分中的任何一个发生变化时自动计算,并且仍然是实体的一部分,以便breeze在事后保存这些变化?

您应该有类似“model.js”的内容在应用程序中定义Breeze如何处理数据。您应该公开函数
configureMetadataStore
,并在其中放置函数:

function configureMetadataStore(metadataStore){
  metadataStore.registerEntityTypeCtor('MyContainerClassFromServerModel', null, thisClassInitializer);
在这之后,您需要定义
这个ClassInitializer
,告诉Breeze如何处理它,您称之为“物化对象”:

这应该能奏效。或者我刚刚想到的,你可以这样定义:

function thisClassInitializer(myObject){
  myObject.customTotal = ko.computed({
    var newValue = myObject.materials() + myObject.processes() + myObject.packaging() + myObject.transport();
    myObject.total(newValue);
    return newValue;
  });
}
不同的是,对于第一个,我不能保证不尝试它(没有那么熟练的ko绑定),但对于另一个,我很确定它应该工作

说明:
当您定义类似这样的内容时,每当Breeze将一个对象从服务器“物化”为一个可观察对象时,它也将调用初始值设定项。通过这种方式,您可以修改对象的字段-通常您将计算值放入其中(如total),这样您就不需要将其保存在服务器上。理想情况下,您不需要服务器上的“total”,因为它不包含任何附加信息-所有信息都在其他变量中,并且可以计算该值。

您的应用程序中应该有类似“model.js”的内容,用于定义Breeze如何处理数据。您应该公开函数
configureMetadataStore
,并在其中放置函数:

function configureMetadataStore(metadataStore){
  metadataStore.registerEntityTypeCtor('MyContainerClassFromServerModel', null, thisClassInitializer);
在这之后,您需要定义
这个ClassInitializer
,告诉Breeze如何处理它,您称之为“物化对象”:

这应该能奏效。或者我刚刚想到的,你可以这样定义:

function thisClassInitializer(myObject){
  myObject.customTotal = ko.computed({
    var newValue = myObject.materials() + myObject.processes() + myObject.packaging() + myObject.transport();
    myObject.total(newValue);
    return newValue;
  });
}
不同的是,对于第一个,我不能保证不尝试它(没有那么熟练的ko绑定),但对于另一个,我很确定它应该工作

说明:
当您定义类似这样的内容时,每当Breeze将一个对象从服务器“物化”为一个可观察对象时,它也将调用初始值设定项。通过这种方式,您可以修改对象的字段-通常您将计算值放入其中(如total),这样您就不需要将其保存在服务器上。理想情况下,您不需要服务器上的“total”,因为它不包含任何附加信息-所有信息都在其他变量中,并且可以计算该值。

您的应用程序中应该有类似“model.js”的内容,用于定义Breeze如何处理数据。您应该公开函数
configureMetadataStore
,并在其中放置函数:

function configureMetadataStore(metadataStore){
  metadataStore.registerEntityTypeCtor('MyContainerClassFromServerModel', null, thisClassInitializer);
在这之后,您需要定义
这个ClassInitializer
,告诉Breeze如何处理它,您称之为“物化对象”:

这应该能奏效。或者我刚刚想到的,你可以这样定义:

function thisClassInitializer(myObject){
  myObject.customTotal = ko.computed({
    var newValue = myObject.materials() + myObject.processes() + myObject.packaging() + myObject.transport();
    myObject.total(newValue);
    return newValue;
  });
}
不同的是,对于第一个,我不能保证不尝试它(没有那么熟练的ko绑定),但对于另一个,我很确定它应该工作

说明:
当您定义类似这样的内容时,每当Breeze将一个对象从服务器“物化”为一个可观察对象时,它也将调用初始值设定项。通过这种方式,您可以修改对象的字段-通常您将计算值放入其中(如total),这样您就不需要将其保存在服务器上。理想情况下,您不需要服务器上的“total”,因为它不包含任何附加信息-所有信息都在其他变量中,并且可以计算该值。

您的应用程序中应该有类似“model.js”的内容,用于定义Breeze如何处理数据。您应该公开函数
configureMetadataStore
,并在其中放置函数:

function configureMetadataStore(metadataStore){
  metadataStore.registerEntityTypeCtor('MyContainerClassFromServerModel', null, thisClassInitializer);
在这之后,您需要定义
这个ClassInitializer
,告诉Breeze如何处理它,您称之为“物化对象”:

这应该能奏效。或者我刚刚想到的,你可以这样定义:

function thisClassInitializer(myObject){
  myObject.customTotal = ko.computed({
    var newValue = myObject.materials() + myObject.processes() + myObject.packaging() + myObject.transport();
    myObject.total(newValue);
    return newValue;
  });
}
不同的是,对于第一个,我不能保证不尝试它(没有那么熟练的ko绑定),但对于另一个,我很确定它应该工作

说明: 当您定义类似这样的内容时,每当Breeze将一个对象从服务器“物化”为一个可观察对象时,它也将调用初始值设定项。通过这种方式,您可以修改对象的字段-通常您将计算值放入其中(如total),这样您就不需要将其保存在服务器上。主意