[英]Reusable Computed Fields in Knockout
我有一个使用映射插件的Knockout Viewmodel。 映射JSON对象后,我创建了一些计算值,如下所示:
/* viewmodel setup and mapping */
myViewModel
.formattedGiftAmount = ko.computed({
read: function () {
return parseInt(this.giftAmount(), 10).formatMoney();
}
, write: function (value) {
this.giftAmount(value.unformatMoney());
}
, owner: this
})
.formattedGoal = ko.computed({
read: function () {
return parseInt(this.goalAmount(), 10).formatMoney();
}
, write: function (value) {
this.goalAmount(value.unformatMoney());
}
, owner: this
});
不要太担心代码的作用,我更关心模式。 正如您所看到的,两个属性formattedGiftAmount()
和formattedGoal()
具有几乎相同的对象来定义它们。 唯一的区别是他们修改了哪些属性。 我可能会有更多像这样的实例,所以我想知道是否有任何方法可以使它更可重用。 我可以想象做这样的事情this[prop]()
,但是我无法弄清楚如何将它注入到对象中并使其工作。
PS:我已经看过这个,但它仍然不能完全满足我的需求。
您还可以修改fn以向ko.observable添加一个函数来创建它,这将允许您以描述性方式( 小提琴 )在构造函数中添加属性:
ko.observable.fn.formatAsMoney = function() {
var base = this;
return ko.computed({
read: function() {
return formatMoney(parseFloat(base()));
},
write: function(newValue) {
base(unformatMoney(newValue));
}
});
};
function ViewModel() {
var self = this;
self.number = ko.observable(10.5);
self.money = self.number.formatAsMoney();
};
您可以向视图模型添加一个函数,该函数基于未格式化的属性创建格式化属性:
myViewModel.addFormattedProperty = function(formattedName, unformattedName) {
this[formattedName] = ko.computed({
read: function() {
return parseInt(this[unformattedName](), 10).formatMoney();
},
write: function(value) {
this[unformattedName](value.unformatMoney());
},
owner: this
});
};
然后你可以为你的房产调用它:
myViewModel.addFormattedProperty('formattedGiftAmount', 'giftAmount');
myViewModel.addFormattedProperty('formattedGoalAmount', 'goalAmount');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.