我有一个问题,我想将所有内容存储为带引号的字符串,并在表单中显示所有未引用的内容。我的第一个解决方案是只创建两个额外的 bindingHandler 来执行此操作,一个用于值,一个用于文本。
ko.bindingHandlers.escapedValue = {
init : function (element, valueAccessor, allBindingsAccessor) {
var $element = $(element),
contentObservable = valueAccessor(),
currentTxt = ko.utils.unwrapObservable(contentObservable);
if (currentTxt) {
$element.val(unescape(currentTxt));
}
$element.change(function (e) {
contentObservable(escape($element.val()));
});
}
};
ko.bindingHandlers.escapedText = {
init : function (element, valueAccessor, allBindingsAccessor) {
var $element = $(element),
contentObservable = valueAccessor(),
currentTxt = ko.utils.unwrapObservable(contentObservable);
if (currentTxt) {
$element.text(unescape(currentTxt));
}
contentObservable.subscribe(function (newValue) {
$element.text(unescape(newValue));
});
}
};
但是,这给了我两个问题 1)我在按下键后不再进行实时更新 2)当我对例如字符长度的值进行一些验证时,它会检查引用字符串的长度。
我怎样才能写出像 ko.escapedObservable() 或 ko.subscribable.fn.escaped() 这样的东西
我已经更近了,但似乎无法正确保存。所以现在它正确显示并正确进行比较但是当我保存它时,值仍然是 unescped
ko.escapedObservable = function (initialValue) {
var observableVal = ko.observable(initialValue),
result = ko.computed({
read: function () {
return unescape(observableVal());
},
write: function (newValue) {
return observableVal(escape(newValue));
}
});
this.toJSON = function () {
return escape(observableVal());
};
return result;
};
====EDIT==== 使用两个可观察对象的解决方案 // Escape 和 Unescape 一个文本值
ko.escapedObservable = function (initialValue) {
var observableVal = ko.observable(initialValue),
result = ko.computed({
read: function () {
return observableVal();
},
write: function (newValue) {
observableVal(newValue);
}
});
result.unescaped = ko.computed({
read: function () {
return unescape(observableVal());
},
write: function (newValue) {
observableVal(escape(newValue));
}
});
return result;
};