Knockout.js 我可以吗;扩展;";“价值”;在敲除中绑定以进行简单的字符替换?

Knockout.js 我可以吗;扩展;";“价值”;在敲除中绑定以进行简单的字符替换?,knockout.js,character-encoding,Knockout.js,Character Encoding,我有一个淘汰网站,在那里我在各种input和textarea字段中捕获用户输入。我想以某种方式连接到“值”绑定,对用户输入的文本进行一些预处理。(例如,我想用直接引号替换“智能引号”) 我之所以要这样做,是因为我最终要将此文本存储在一个Oracle数据库中,该数据库的字符集是8位字符集(我无法更改)。因此,当文本存储在数据库中时,用户键入的无法转换为该字符集的任何Unicode字符都将替换为“?”字符 最常见的实例是智能引号(在Word或Outlook粘贴的文本中)和某些符号,如欧元符号。对于大

我有一个淘汰网站,在那里我在各种
input
textarea
字段中捕获用户输入。我想以某种方式连接到“值”绑定,对用户输入的文本进行一些预处理。(例如,我想用直接引号替换“智能引号”)

我之所以要这样做,是因为我最终要将此文本存储在一个Oracle数据库中,该数据库的字符集是8位字符集(我无法更改)。因此,当文本存储在数据库中时,用户键入的无法转换为该字符集的任何Unicode字符都将替换为“?”字符

最常见的实例是智能引号(在Word或Outlook粘贴的文本中)和某些符号,如欧元符号。对于大多数这些,有一个可以接受的替代品,我可以很容易地使用

我的计划是在用户的文本进入数据库之前拦截它,并做一些简单的替换。我不想把代码分散在我的应用程序中,因为所有的文本都是通过KO绑定来的,所以这似乎是一个很好的中心位置


有人这样做吗?有什么建议吗?替代方案?

您可以创建一个自定义绑定处理程序,该处理程序将环绕knockout的绑定处理程序,并可以在其中添加自定义逻辑

例如:

ko.bindingHandlers.customValueHandler= {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {

// setup what happens when the binding initializes
// my custom logic here    


// call knockouts value bind init
ko.bindingHandlers.value.init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);

},
    update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {

// setup what happens when the observable update
// my custom logic here   

// you can then call knockouts update part of default handler
        ko.bindingHandlers.value.update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
    }
}
通过这种方式,您可以使用原始“值”、“文本”或任何其他敲除内置绑定的默认功能,同时还可以围绕它包装您自己的自定义逻辑。
这当然意味着您必须将数据绑定重新写入新的自定义处理程序。

您可以创建一个自定义绑定处理程序,该处理程序将环绕knockout的绑定处理程序,您可以在其中添加自定义逻辑

例如:

ko.bindingHandlers.customValueHandler= {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {

// setup what happens when the binding initializes
// my custom logic here    


// call knockouts value bind init
ko.bindingHandlers.value.init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);

},
    update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {

// setup what happens when the observable update
// my custom logic here   

// you can then call knockouts update part of default handler
        ko.bindingHandlers.value.update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
    }
}
通过这种方式,您可以使用原始“值”、“文本”或任何其他敲除内置绑定的默认功能,同时还可以围绕它包装您自己的自定义逻辑。
这当然意味着您必须将数据绑定重新写入新的自定义处理程序。

好吧,我已经找到了一些可行的方法——尽管我不相信这是一个健壮的解决方案

实际上,我将内置的
value
绑定的
init
方法替换为在写入值时进行字符转换的方法:

(注意:下面的代码是typescript而不是纯javascript)

to8Bit
是我进行字符替换的函数)


改变主意…:-)

嗯,我找到了一些有效的方法——尽管我不相信这是一个可靠的解决方案

实际上,我将内置的
value
绑定的
init
方法替换为在写入值时进行字符转换的方法:

(注意:下面的代码是typescript而不是纯javascript)

to8Bit
是我进行字符替换的函数)


改变主意…:-)

创建一个新的应用程序怎么样?@Adrian:这当然会起作用,不过这意味着我需要在整个应用程序中装饰我所有的绑定观察值,这是我希望避免的。理想情况下,我想做一个影响所有输入文本的更改,这样我就不会错过一个。听起来这应该是在服务器上实现的功能,而不是在客户端实现的功能。影响所有输入文本的单个更改应该是写入数据库之前的一个卫生步骤。您是否将
value
valueUpdate
选项一起使用?@MichaelBest:不。我不确定这会有什么帮助?创建一个如何?@Adrian:这肯定会起作用,虽然这意味着我需要在整个应用程序中装饰我的所有绑定观察,这是我希望避免的。理想情况下,我想做一个影响所有输入文本的更改,这样我就不会错过一个。听起来这应该是在服务器上实现的功能,而不是在客户端实现的功能。影响所有输入文本的单个更改应该是写入数据库之前的一个卫生步骤。是否将
value
valueUpdate
选项一起使用?@MichaelBest:不。我不确定这会有什么帮助?谢谢。如此接近:-)最后一部分(“您将不得不重新编写数据绑定”)是不幸的。我目前正在试验,看看我是否可以简单地用自定义版本覆盖“值”绑定…我通常不喜欢直接处理第三方的东西,除非存在某种未解决的bug,但这是你的情况,你比我更清楚你需要什么!谢谢如此接近:-)最后一部分(“您将不得不重新编写数据绑定”)是不幸的。我目前正在试验,看看我是否可以简单地用自定义版本覆盖“值”绑定…我通常不喜欢直接处理第三方的东西,除非存在某种未解决的bug,但这是你的情况,你比我更清楚你需要什么!在此处使用
ko.pureComputed
而不是
ko.computed
。否则,计算机将永远无法清理。另外,您应该在read函数中调用
valueAccessor
来捕获所有依赖项:
read:()=>ko.unwrap(valueAccessor())
@MichaelBest:Thank。我不太担心计算机没有被清理,因为每页不会创建那么多计算机,而且页面寿命很短(这不是SPA),但仍然很好。@MichaelBest:这是你的第二点。。。这让我觉得我不应该搞乱这些东西,因为我真的不明白为什么在函数中调用
valueAccessor
会更容易捕获依赖项。我知道它会被“稍后”调用,并且会被多次调用,但是。。。它是否会返回不同的值?我真希望我