【发布时间】:2017-06-18 11:39:15
【问题描述】:
我创建了一个计算出的 observable,它可以很好地格式化电话号码。当焦点离开表单域时,它将获取一串数字并将其剥离为 xxx-xxx-xxxx 格式。然后我有一个控制器操作将其剥离为 xxxxxxxxxx 格式,然后再保存到数据库中。然后我计算出的 observable 将其重新格式化为 xxx-xxx-xxxx 格式。
我现在想要创建一个可重用的自定义绑定处理程序,该处理程序可以在我们的应用程序中实现。问题是我无法让它完成最后一部分,它在表单字段中重新格式化它。所以,问题是当我单击更新时,表单字段将数字显示为 xxxxxxxxxx(与数据库中的方式相同)有谁知道我需要通过自定义绑定工作来更改什么,就像我当前计算的 observable 一样?
可观察:
self.Phone = ko.observable(model.MainPhone ? model.MainPhone : "").extend({ maxLength: 20, minLength: 10 });
Computed Observable 工作正常:
self.PhoneFormat = ko.computed(function () {
var phoneFormatting = self.Phone()
.replace(/\D+/g, "")
.replace(/^[01]/, "")
.replace(/(\d{3})(\d{3})(\d{4})/, "$1-$2-$3")
.substring(0, 12);
return self.Phone() ? self.Phone(phoneFormatting) : "";
}, self);
自定义绑定无法正常工作:
ko.bindingHandlers.formatPhone = {
init: function (element, valueAccessor, allBindings) {
var source = valueAccessor();
var formatter = function () {
return ko.computed({
read: function() { return source(); },
write: function(newValue) {
source(newValue.replace(/\D+/g, "")
.replace(/^[01]/, "")
.replace(/(\d{3})(\d{3})(\d{4})/, "$1-$2-$3")
.substring(0, 12));
}
});
};
ko.bindingHandlers.value.init(element, formatter, allBindings);
},
update: function(element, valueAccessor, allBindings) {
var source = valueAccessor();
var formatter = function() {
return ko.computed({
read: function() { return source(); },
write: function(newValue) {
source(newValue.replace(/\D+/g, "")
.replace(/^[01]/, "")
.replace(/(\d{3})(\d{3})(\d{4})/, "$1-$2-$3")
.substring(0, 12));
}
});
};
ko.bindingHandlers.value.update(element, formatter, allBindings);
}
};
【问题讨论】:
-
你能显示与“当我点击更新”相关的代码吗?那是一个按钮吗?更新究竟做了什么?
-
当然杰森!它是一个按钮,控制器代码如下:
client.ContactPhone = phoneNumber == null ? null : Regex.Replace(phoneNumber, @"[^\d]", ""); -
哦,它用于更新客户信息页面上字段的任何更改。
-
取出你的
update函数并将value.init调用替换为ko.applyBindingAccessorsToNode(element, { value: formatter }, bindingContext)(你还需要扩展你的init以获得bindingContext)。
标签: javascript mvvm knockout.js