0

我有一个问题,我想将所有内容存储为带引号的字符串,并在表单中显示所有未引用的内容。我的第一个解决方案是只创建两个额外的 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;
};
4

2 回答 2

1
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;
};
于 2013-05-04T00:44:58.650 回答
0

我很难弄清楚你在问什么。但是,我相信你真的只需要一个计算出的 observable[示例]

function viewModel() {
    this.test = ko.observable('\"Something\"');

    this.escapedTest = ko.computed(function () {
        return escape(this.test());
    }, this);

    this.unescapedTest = ko.computed(function () {
        return unescape(this.escapedTest());
    }, this);
}
于 2013-04-18T16:51:49.583 回答