Javascript 映射后应用敲除扩展程序

Javascript 映射后应用敲除扩展程序,javascript,knockout.js,Javascript,Knockout.js,我遇到了一个问题,在创建了可观察对象之后,向其添加一个淘汰扩展程序。在下面的示例中,每当值按预期更改时,扩展器都会在foo上运行,但对于bar,仅在第一次调用时运行一次 var viewModel = function(){ var self = this; self.foo = ko.observable(1).extend({ numeric: 1 }); self.bar = ko.observable(1); self.bar.extend({ nu

我遇到了一个问题,在创建了可观察对象之后,向其添加一个淘汰扩展程序。在下面的示例中,每当值按预期更改时,扩展器都会在
foo
上运行,但对于
bar
,仅在第一次调用时运行一次

var viewModel = function(){
    var self = this;

    self.foo = ko.observable(1).extend({ numeric: 1 });

    self.bar = ko.observable(1);

    self.bar.extend({ numeric: 1 });
};
实际上,我正在映射一个大型JSON对象,并希望在映射到某些属性之后添加扩展程序。有没有一个简单的方法可以做到这一点

下面是一个显示问题的JSFIDLE:


您遇到的问题是,扩展器正在创建一个新的可观察对象(基于它扩展的可观察对象)。而新的observable并没有在您对
extend
的第二次调用中使用

要解决此问题(不更改扩展器的代码),您可以将调用
extend
的响应分配到它所调用的相同属性中

换句话说,在最后一行前面添加
self.bar=
,以便:

self.bar = self.bar.extend({ numeric: 1 });

此解决方案不会对子观测值的模板重新渲染作出反应。试试这个活生生的例子2.我不知道你的意思。OP和我将我们的代码基于发布在文档页面上的相同
ko.extenders.numeric
。如果你的方法与我的方法有很大不同,请发布一个新的答案。也许我误解了一些东西,但这并没有如预期的那样起作用,检查一下哦,我现在明白你的意思了。但是我认为对于这个特定的问题,
numeric
extender即使在映射之后应用也能很好地工作:。我还认为我找到了
required
扩展器的解决方案:(再次调用
applyBindings
)再次调用
applyBindings
将为已经绑定的元素抛出异常。顺便说一句,谢谢:)