Knockout.js 是否可以将微风产生的可观测值重新定义为计算场?
我可能没解释清楚 我使用breeze js实现一个实体,该实体包含近100个浮点字段。这些是计算结果字段,其中有4个单独的部分,然后是总数,重复19次。因此,19 x 5=95个字段,因此“接近100个” 基本上是: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
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),这样您就不需要将其保存在服务器上。主意