【问题标题】:Knockout custom binding to a computed column淘汰自定义绑定到计算列
【发布时间】:2013-12-09 23:56:25
【问题描述】:

我有一个“金钱”的自定义绑定。它将在开头插入一个美元符号,并为小数点后每 3 位添加列。此外,同一列是 ko.computed 列。

我遇到了问题,我必须将该列格式化为 setter:

myColumn.myValue(functionToGenerateNewValue(parameter)()); //notice the parens after the function to actually retrieve the value

为了让它能够正确地进行货币绑定。但是,如果我希望计算的值能够即时工作,那么它必须以这种方式设置:

myColumn.myValue = ko.computed(functionToGenerateNewValue(parameter));

这是绑定钱的代码:

var cleanInput = function (value) {
    return parseFloat(value.replace(/[^0-9.-]/g, ''));
}

ko.bindingHandlers.money = {
    init: function (elm, valueAccessor) {
        $(elm).change(function () {
            valueAccessor()(cleanInput(elm.value));
        }).addClass('money');
    },
    update: function (elm, valueAccessor, allBindingsAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor())
        $elm = $(elm),
        method = $elm.is(":input") ? "val" : "html";
        $elm[method](formatCurrency(value));
    }
};

当 this 作为计算值调用时,elm.value 是失败的部分,因为它包含一个函数而不是一个值。

知道如何将这两种实现混合在一起吗?

编辑:这是我的新版本,我仍然有点坚持......

if (goalMonth > viewModel.LastProcessedMonth()) {
                    if (goal.LYMonthSales() === goal.LYMonthSalesActual()) {

                        goal.LYMonthSales = ko.computed({
                            read: generateTotalSales(goalMonth),
                            write: function (newValue) {
                                goal.LYMonthSales(newValue);
                            }
                        });
                        goal.LYMonthSalesComputed = ko.computed({
                            read: goal.LYMonthSales,
                            write: function (newValue) {
                                goal.LYMonthSales(newValue);
                            }
                        });
                        //goal.LYMonthSales(generateTotalSales(goalMonth)());
                    }

                    goal.LYMonthSalesActual = ko.computed(generateTotalSales(goalMonth));
                    //goal.LYMonthSalesActual(generateTotalSales(goalMonth)());
                }

以前视图上显示“LYMonthSales”,但现在我显示的是“LYMonthSalesComputed”。

现在,“写入”不会将值写入 LYMonthSales 属性。 (调用我的save时,原来的值还是存在的)

【问题讨论】:

标签: javascript knockout.js


【解决方案1】:

我想你想要一个writeblae computed observable。这将允许您指定将新值写入计算的逻辑。像这样的:

myColumn.myValue = ko.computed({
    read: functionToGenerateNewValue(parameter),
    write: function(newVal){
       //now manually provide the logic to handle a new value
    },
    owner: myColumn //optional - will cause the `this` value to be correct
});

【讨论】:

  • 你能看看我更新的问题吗,我在实现可写计算 observable 时仍然遇到一些问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多