前面文章讲述了observables扩展,其实与fn扩展相比,二者并无本质区别,只是某些参数上的使用有点异样。
对于上面的几个核心组件都可以使用fn扩展。
基本语法
ko.observable.fn.myExtend = function(myOption) {
//do something ...
return this;
}
仅以observable扩展为例。
如何使用
this. 属性名= ko.observable().myExtend("参数" );
下面还以observables扩展中示例演示,来对二者使用上的不同进行比较。
示例1:数据验证(validate)
Html代码
<p> 输入产品名称:
<input data-bind='value: productName' />
<span data-bind='visible: productName.hasError, text: productName.validationMessage'> </span>
</p>
Js代码
<script type="text/javascript">
ko.observable.fn.required = function(overrideMessage) {
var target = this;
//验证提示是否显示
target.hasError = ko.observable();
//验证提示信息
target.validationMessage = ko.observable();
//定义一个产品名称验证器,用于显示订阅
function validate(newValue) {
target.hasError(newValue ? false : true);
target.validationMessage(newValue ? "" : overrideMessage);
}
//验证初始值
validate(target());
//添加订阅
target.subscribe(validate);
//原样返回依赖属性,即:ko.observable(productName)
return target;
};
function AppViewModel(productName) {
this.productName = ko.observable(productName).required("产品名称不能为空!" );
}
ko.applyBindings(new AppViewModel("HTC ONE"));
</script>
示例2:重写computed
Html代码
<p><input data-bind="value: myNumber" /> (round to whole number)</p>Js代码
<script type="text/javascript">
ko.observable.fn.numeric = function(precision) {//precision:小数点后保留的位数
var target = this;
//创建一个依赖属性
var result = ko.computed({
read: target,
write: function(newValue) {//重写write
var current = target(),
roundingMultiplier = Math.pow(10, precision),
newValueAsNum = isNaN(newValue) ? 0 : parseFloat(+newValue),
valueToWrite = Math.round(newValueAsNum * roundingMultiplier) / roundingMultiplier;//对输入进行四舍五入计算
//输入值改变时,同步更新属性值
if (valueToWrite !== current) {
target(valueToWrite);
}
}
});
//计算初始值的四舍五入值
result(target());
//返回创建的 computed observable
return result;
};
function AppViewModel(myNumber) {
this.myNumber = ko.observable(myNumber).numeric(2);
}
ko.applyBindings(new AppViewModel(221.225));
</script>