Javascript 如何将extender添加到现有的observable in Knockout中

Javascript 如何将extender添加到现有的observable in Knockout中,javascript,knockout.js,Javascript,Knockout.js,我已经看过了: 问题是我正在使用fromJs创建我的视图模型,因此我的observerables已经存在。我想我可以做以下操作来添加扩展器: var data = result.Data; if (!window.vmRealTimeActivity) { window.vmRealTimeActivity = ko.mapping.fromJS(data, mappingKeys); ko.applyBindings(vmRealTimeActivity, $('#secon

我已经看过了:

问题是我正在使用fromJs创建我的视图模型,因此我的observerables已经存在。我想我可以做以下操作来添加扩展器:

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
vmRealTimeActivity.MyExistingObservable = vmRealTimeActivity.MyExistingObservable.extend({ numeric: null });
我的扩展器在第一次连接扩展器时被调用,但不是在尝试更改值之后

我读了另一篇SO帖子,其中说.extend()创建了一个新的可观察对象,所以你必须这样做,但这也不行:

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
vmRealTimeActivity.MyExistingObservable = vmRealTimeActivity.MyExistingObservable.extend({ numeric: null });
除了不再调用我的格式化程序外,该值开始返回


如何以正确的方式将扩展器连接到现有的可观察对象?

由于您使用的是映射插件,因此可以指定
创建
回调。如果将以下内容添加到现有的MappingKey中,它可能会起作用(我不知道确切的映射,因此您可能需要在此处或此处更改位):

这将导致从yor数据映射时的扩展可观测性


通过一个工作示例(vm1)和您当前的非工作示例(vm2)进行比较,上面的答案是正确的,但是对于任何感兴趣的人来说,我发现更简单的方法是只在客户端创建视图模型并使用fromJs刷新它们,而不是同时创建和刷新它们。然后,您可以在此处应用答案,以支持将扩展添加到父视图模型和子视图模型:


无论采用哪种方法,您都必须创建其他映射。

谢谢!这将如何应用于可观测阵列?以前我是这样做的:$.each(vmRealTimeActivity.Goals(),函数(I,e){e.Count.extend({numeric:null});});>>因此,我可以扩展自动生成的Goals集合的Count属性。我试过这样的方法:create:function(options){var newArray=ko.observatarray(options.data);>>基于您的代码,但运气不佳。这方面还有很多改进空间,但我只想举一个简单的例子。您不必在“创建”回调中返回新的观察值,也可以返回一个新的viewmodel。只需看一看mapping插件的“使用“创建”自定义对象构造”部分谢谢,我会看一看。这很讽刺,因为我以前手动创建了视图模型,然后我改用fromJs,这似乎比它的价值要大。很抱歉,最后一次打扰你。我意识到我只需要定义视图模型并使用fromJs刷新它。但是,我看不到任何方法来应用扩展,因为它在子视图模型和fromJs对此一无所知。我在想,当使用fromJs时,一定有某种方法可以映射子视图模型?我举了一个例子,你可以看到:Nm,我在这里找到了答案: