一个直观的方式,我虽然我能够使用KO映射插件将创建一个裸体viewModel只有我需要的任何计算observables,然后更新与vm fromJS
每当服务器结果进来。我认为缺少的属性将被添加,现有的将被更新。KnockoutJS映射 - 只需填写我需要的服务器
我以为我可以将这个裸体ViewModel绑定到我的dom上document.ready,任何缺少的属性显示空白。然后,当ajax回调触发,并且映射库添加新属性时,dom会更新。
我看到的结果似乎表明,这是不可能的,但我想确保我不会错过任何东西。
的代码如下,但是我发现了三个主要问题是:
如果DOM绑定到是一个从ViewMoel缺少的属性,这是一个错误。这并不奇怪,尤其是考虑到@madcapnmckay下面的清晰解释。
如果计算的observable引用ViewModel中缺少的视图模型属性,那就是错误。我假设情况是这样,因为所有computedObservables都会立即执行,因此KO可以跟踪computedObservable依赖的哪些可观察属性。
最具破坏性的,它看起来像一个现有的视图模型只能
fromJS
更新如果视图模型是与fromJS
最初创建。在代码中查看它看起来像fromJS
看起来在第二个参数 - 如果传递 - 检查映射属性。
我不需要任何帮助解决这个问题。我已经想出了一个简单的方法来处理这一切;我只是想确保没有什么简单的东西可以让事情变得更加简单。
VM:
var vm = new (function() {
this.prettyName = ko.computed(function() {
return this.title() + " " + this.name();
}, this);
})();
“AJAX” 的结果:
var serverObj = {
title: 'Mr.',
name: 'Adam Rackis',
degreeValue: 2,
degreeTypes: [{ val: 1, txt: 'Bachelors' }, { val: 2, txt: 'Masters' }, { val: 3, txt: 'PhD'}]
};
HTML
<div id="educationPane">
Name: <input type="text" data-bind="value: prettyName" />
Degree: <select data-bind="{foreach: degreeTypes, value: degreeValue}">
<option data-bind="{text: text, value: val}"></option>
</select>
</div>
谢谢你的答复。是的,第一点和第二点并不令人惊讶(我甚至在第二点提到了和我一样的推理),但第3点似乎是最麻烦的。我无法想象为什么他们会这样做。 – 2012-03-13 19:08:27
@AdamRackis - 我一直在考虑编写一个基本的ViewModel类来实现map/unmap/update功能,我可以在这个周末看看。 – madcapnmckay 2012-03-14 20:52:02