如何使用ko.mapping插件刷新视图模型的一部分?

时间:2012-09-12 22:39:32

标签: knockout.js knockout-mapping-plugin

我有一个像这样的复杂视图模型:

    function DiaryBundleViewModel() {
        var self = this;

        self.existingJobSearchViewModel = new ExistingJobSearchViewModel(self);

        self.DiaryBundle = ko.observable();
        self.Appointment = ko.observable();
...

我已将我的视图模型绑定到我的UI,如:

var vm = new DiaryBundleViewModel();
ko.applyBindings(vm);

在我的视图模型中,我有一个从服务器获取约会的功能。

当我从服务器返回结果时,我这样做:

self.Appointment(result);

并使用显示约会的字段更新UI。

但是,只有约会本身是一个ko.observable。我的Appointment对象上有相互关联的属性,我想在UI中触发更改。所以,我需要ko.mapping插件。

但是,在这种情况下,我正在努力使用它。

如果我这样做:

self.Appointment = ko.mapping.fromJS(result);

它不起作用,因为UI已经绑定到self.Appointment,我刚刚覆盖了它,所以它不会看到更改。

所以,我试过了:

ko.mapping.fromJS(result, self.Appointment);

但这也不起作用。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

首先,您需要创建一个AppointmentVm并使用Mapping插件。

预约:

 var AppointmentVm= function(data) {
    ko.mapping.fromJS(data, { }, this);
};

在您使用的主视图模型中:

ko.mapping.fromJS(data, {
        'Appointments': {
            create: function(options) {
                return new AppointmentVm(options.data);
            }
        }
    },this);

这映射了子对象。