【问题标题】:Force a new value to Knockout Computed强制为 Knockout Computed 设置一个新值
【发布时间】:2014-07-09 17:26:35
【问题描述】:

我正在使用 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。我已经能够使用以下方法将输入值重置为 0 hacky jQuery,但这不会重置 DOM/KO 级别的值。

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

【问题讨论】:

  • 在淘汰赛中读/写你试过吗?使用它你可以强制一个新值。欢呼
  • 你如何写回你正在读取的相同值?或者更具体地说,如何使用上面的示例将 0 写入 self.background_treatments... 变量?

标签: javascript jquery knockout.js knockout-2.0


【解决方案1】:

也许这对你有用:

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

相反,使用一个有范围的变量,以便在 ViewModel 中的任何地方都可以访问它。另外,将subscribe 添加到您的label observable 中,以便它重置这个新变量。我不知道您的整个代码是什么样的,例如:

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;
        });
    };
}

在阅读了您的 cmets 之后,我相信这可能会解决点击事件:

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

【讨论】:

  • 我不太确定这是否是我所追求的。我实际上只是希望能够将'0'写入 self.background_treatmwnts.... 例如:$('label').on('click', function () { // reset to zero });
  • 所以您在单击​​按钮时希望文本框重置为 0.0%,但希望标签保持原样?例如,如果文本框显示为 10.0%,标签显示为 10.0%,然后单击按钮,您希望文本框变为 0.0%,而标签保持为 10.0%?
  • 不,它必须将所有内容重置为 0,问题是该值是计算变量的总和,并且很难将 0 写入该变量。
猜你喜欢
  • 1970-01-01
  • 2017-06-04
  • 2018-05-26
  • 2021-07-15
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
相关资源
最近更新 更多