如何将扩展器添加到Knockout中的现有observable

时间:2014-05-12 02:24:53

标签: javascript knockout.js

我看过这个: 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。

如何以适当的方式将扩展程序附加到现有的可观察对象上?

2 个答案:

答案 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

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