0

我正在开发一个在线表单系统,其中的表单需要随着时间的推移而更新。我将 Knockout.js 与 Mapping 插件结合使用来完成此任务,并且运行良好。

但是,我遇到的一个问题是,它似乎拒绝在 ViewModel 上保存不在从数据库加载的 JSON 对象中的任何属性。例如,如果保存到数据库的 ViewModel 如下所示:

var viewModel = {
    prop1: ko.observable(""),
    prop2: ko.observable(""),
    prop3: ko.observableArray()
};

我将“viewModel”变量初始化为此原型,然后从服务器加载我的 JSON 数据,ko.mapping.fromJSON(data, {}, viewModel);这按预期工作。这是我的问题所在;如果我的 viewModel 现在有一个额外的属性,像这样:

var viewModel = {
    prop1: ko.observable(""),
    prop2: ko.observable(""),
    prop3: ko.observableArray(),
    prop4: ko.observableArray()
};

如果我加载基于第一个原型创建的 JSON 数据,我可以访问 viewModel 中的第四个属性,从数组中添加和删除并在屏幕上看到它更新,但它不会使用ko.mapping.toJSON(viewModel). 我正在收集这与“ ko_mapping_ ”属性有关,这些属性被分配给使用映射插件映射的viewModel部分。如果以前已经解决过这种情况,我深表歉意,但我找不到答案。

我需要能够更新 viewModel 的原型,因为它的特定要求可能会随着时间的推移而略有不同。这可能发生在我的任何表单上,所以一个通用的解决方案会很棒!

谢谢你。

4

1 回答 1

0

Knockout 映射插件会自动创建必要的对象和 observables 来对你提供给它的 JSON 进行建模,所以让它处理视图模型通常更容易,所以它总是与你在服务器上的内容保持同步:

var viewModel = function (data) {
    var model = ko.mapping.fromJS(data);

    // any custom observables not present in the JSON here

    return model;
}
于 2013-06-26T16:57:26.137 回答