强制Knockout Computed新值

时间:2014-07-09 17:26:36

标签: javascript jquery knockout.js knockout-2.0

我正在使用Knockout构建一个非常数字/选项繁重的应用程序,而我目前正在处理的屏幕上,在幕后发生的事情方面非常复杂。整个屏幕是动态的,显示的选项是从observableArray生成的。

示例:

function backgroundTreatmentsOption(label, value, active, name) {
    var self = this;
    self.label = ko.observable(label),
    self.value = ko.isObservable(value) ? value : ko.observable(value),
    self.active = ko.isObservable(active) ? value: ko.observable(active),
    self.name = ko.observable(name)
};

self.background_treatments_options = ko.observableArray([]);

self.background_treatments_options.push(new backgroundTreatmentsOption(
    Treatment_Settings[0].Background_Treatments[0].Label_dose_H1s[0].label_text,
    sessionStorage.getItem('background_treatments_label_dose_h1s_value') || Treatment_Settings[0].Background_Treatments[0].Label_dose_H1s[0].default_value,
    false,
    'bg-label-dose-h1s'
));

然后获取每个对象的值(self.value)(稍后在应用程序中使用)我执行以下操作:

self.background_treatments_updosed_h1s_2x_3x_4x_value = ko.computed(function () {
    var value = 0;
    for (var i = 0; i < self.background_treatments_options().length; i++) {
        if (i == 1) {
            value += parseFloat(self.background_treatments_options()[i].value());
        }
    }
    return value;
});

现在这是一个有点复杂的解释,所以请告诉我是否有任何事情没有直接意义。

每个标签(self.label),当点击切换“活动”标签时, DOM中该元素的状态,以显示它打开/关闭的可见外观。

当标签切换为“关闭”时我需要强制相关值(在这种情况下它是self.background_treatments_updosed_h1s_2x_3x_4x_value)重置为0.我已经能够使用hacky jQuery将输入的值重置为0但是这个不会重置DOM / KO级别的值。

所以我的问题是,当点击标签时,我如何强制self.background_treatments_updosed_h1s_2x_3x_4x_value成为0?

1 个答案:

答案 0 :(得分:0)

也许这对你有用:

var value = 0;计算的observable中删除background_treatments_updosed_h1s_2x_3x_4x_value

相反,请使用作用域的变量,以便可以在ViewModel中的任何位置访问它。另外,在subscribe可观察对象中添加label,以便重置此新变量。我不知道你的代码是什么样的,例如:

function ViewModel() {
    var self = this;
    var updosedValue = 0;
    self.background_treatments_updosed_h1s_2x_3x_4x_value = ko.computed(function () {
        for (var i = 0; i < self.background_treatments_options().length; i++) {
            if (i == 1) {
                updosedValue += parseFloat(self.background_treatments_options()[i].value());
            }
        }
        return updosedValue;
    };
    function backgroundTreatmentsOption(label, value, active, name) {
        var self = this;
        self.label = ko.observable(label);
        self.value = ko.isObservable(value) ? value : ko.observable(value);
        self.active = ko.isObservable(active) ? value: ko.observable(active);
        self.name = ko.observable(name);
        self.label.subscribe(function(value) {
            if (!value)
                updosedValue = 0;
        });
    };
}

阅读完评论后,我相信这可能会解决点击事件:

self.resetValueToZero = function () {
    self.computedValues([]);
    self.computedValues.push(new computedValue(
        'getValueOne:',
        0
    ));
};