我看过这个: http://knockoutjs.com/documentation/extenders.html
问题是我使用fromJs创建我的视图模型,所以我的观察者已经存在。我认为我可以执行以下操作来添加扩展程序:
var data = result.Data;
if (!window.vmRealTimeActivity) {
window.vmRealTimeActivity = ko.mapping.fromJS(data, mappingKeys);
ko.applyBindings(vmRealTimeActivity, $('#second-btm')[0]);
} else {
ko.mapping.fromJS(data, vmRealTimeActivity);
}
vmRealTimeActivity.MyExistingObservable.extend({ numeric: null });
vmRealTimeActivity.MyExistingObservable(9999); // doesn't call numeric extender
我的扩展程序在第一次附加扩展程序时被调用,但在尝试更改值后却没有。
我读了另一篇SO帖子,声明.extend()会创建一个新的可观察者,所以你必须这样做,但这也不起作用:
vmRealTimeActivity.MyExistingObservable = vmRealTimeActivity.MyExistingObservable.extend({ numeric: null });
除了第二次不调用我的格式化程序之外,该值开始返回NaN。
如何以适当的方式将扩展程序附加到现有的可观察对象上?
答案 0 :(得分:2)
由于您使用的是映射插件,因此您可以指定create
回调。如果您将以下内容添加到现有的mapsKeys中,它可能会起作用(我不知道您的确切映射,因此您可能需要在此处更改位):
'MyExistingObservable': {
create: function(options) {
return new ko.observable(options.data).extend({ numeric: null });
}
}
这导致从yor数据映射时的扩展observable。
带有工作示例(vm1)的Here's a jsFiddle和您当前的非工作示例(vm2)进行比较
答案 1 :(得分:0)
上面的答案是正确的,但对于任何有兴趣的人,我发现更简单的方法是创建视图模型客户端并使用fromJs来刷新它们,而不是创建和刷新它们。然后,您可以在此处应用答案,以支持向父视图模型和子视图模型添加扩展:Map JSON data to Knockout observableArray with specific view model type
无论采用哪种方法,您都必须创建其他映射。