Knockout共享一个绑定处理程序

时间:2014-04-24 11:21:28

标签: javascript jquery knockout.js knockout-2.0

我目前正在Knockout中构建一个重型应用程序。在我的应用程序中有三种类型的数字:百分比,小数和大数字,我有每种类型的自定义绑定处理程序。

对于输入我还创建了一个数字验证bindingHandler,它读取每个按键以确保它是一个输入的数字。 (在应用程序中有华丽的边框CSS动画和东西 - 这只是一个简单的剥离示例)。

现在让输入执行验证检查和数字格式化,我必须将变量绑定两次,正如您在下面的小提琴中正确看到的那样。

<input data-bind="number: testdata, percentage: testdata">

我认为这会不必要地增加我的HTML标记,并且必须有一种更整洁的方式同时触发两个处理程序。

我的问题:是否可以将数字验证脚本创建为一个函数,然后可以在数字格式处理程序中共享/包含该函数;没有膨胀我的Javascript?

我仍然是Knockout的新手,所以我仍然不确定它的界限。

请参阅小提琴:http://jsfiddle.net/axV6S/1/

2 个答案:

答案 0 :(得分:2)

是的,你可以将数字init提取到它自己的函数中,即改变它:

ko.bindingHandlers.number = {
    init: function (element) {
        /* ... */
    }
};

进入这个:

var numberInit = function(element) {
    /* ... */
};

只需从你的其他初始化调用它:

init: function(element, valueAccessor) {
    numberInit(element);
    /* ... */
}

或者如果你想保持正确的“这个”背景:

init: function(element, valueAccessor) {
    numberInit.apply(this,arguments);
    /* ... */
}

答案 1 :(得分:0)

你在淘汰赛中复制了很多内置功能。创建viewmodel时,您可以为模型属性定义限制。你可以为很多数值数据做到这一点:

this.FieldName = ko.observable().extend({ pattern: regex });

这将限制您的文本字段,并且您不需要监听按键,并采取措施。 Knockout会在后台为您做到这一点!

查看更多示例:http://mikedormitorio.azurewebsites.net/BlogPost/the-native-validation-rules-of-knockout-validation

这也是一个有用的读物​​:http://knockoutjs.com/documentation/extenders.html