2012-03-13 66 views
1

一个直观的方式,我虽然我能够使用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> 

回答

1

与KO工作时,我已经打了所有这些相同的问题。在我看来,第1点和第2点只是KO工作原理的结果。

  • 当DOM绑定到一个不存在的结合 需要为了工作订阅可观察的或显示属性值的属性。如果随后将该属性添加到viewModel,绑定如何知道这发生了? (A更复杂的解决方案将是,以允许视图模型对象本身可观察到,但是另一回事)
  • 当计算观察到的被创建它包含函数被立即评估,使得可以记录订阅可观测量和计算可在需要时重新评估。如果不存在可观测量(即时误差,可以通过测试进行修复),或者在计算结果的评估中没有发现可观测量,则不会再进行评估。
  • -

点3我承认是一种痛苦。我不知道这样做的原因。也许有一些很好的理由。至少一个只更新属性并且不会从集合中删除的'更新'方法会很有用。

希望这会有所帮助。

+0

谢谢你的答复。是的,第一点和第二点并不令人惊讶(我甚至在第二点提到了和我一样的推理),但第3点似乎是最麻烦的。我无法想象为什么他们会这样做。 – 2012-03-13 19:08:27

+0

@AdamRackis - 我一直在考虑编写一个基本的ViewModel类来实现map/unmap/update功能,我可以在这个周末看看。 – madcapnmckay 2012-03-14 20:52:02