【发布时间】: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时,原来的值还是存在的)
【问题讨论】:
-
查看 Sanderson 的新投影库 :: blog.stevensanderson.com/2013/12/03/…