2012-03-13 5 views
1

直感的な方法は1つですが、私はKOマッピングプラグインを使用することができましたが、必要なものだけを使ってnaked viewModelを作成し、サーバーの結果が来るたびにfromJSとなりました。不足しているプロパティーが追加され、既存のプロパティーが更新されると仮定しました。KnockoutJSマッピング - サーバーから必要な情報を入力してください

私はちょうど欠落しているプロパティが空白を示すと、document.ready上の私のDOMに、この裸のViewModelを結合することができると思いました。次に、ajaxコールバックが起動し、マッピングライブラリが新しいプロパティを追加すると、DOMが更新されます。

私が見た結果は、これが不可能であることを示していると思います。私は何かが欠けていないことを確認したかったのです。

コードは以下ですが、私が見つけた三つの主要な問題であった:DOMはViewMoelから欠けているプロパティにバインドされている場合

  • 、それは誤りです。これは驚くべきことではありません。特に以下の説明は、@ madcapnmckayの説明を参考にしてください。

  • 計算に観察参照ViewModelに欠席のビューモデルのプロパティなら、それは誤りです。計算されたObservableはすべて即座に実行されるため、KOはcomputedObservableが依存している観測可能なプロパティを追跡できるため、このケースを想定しています。

  • ほとんど壊滅的な、それはそのViewModelには、もともとfromJSで作成した場合、既存のViewModelにのみfromJSで更新することができますように見えます。 fromJSのように見えるコードを調べると、2番目のパラメータが渡されていれば、mappingsプロパティを調べます。

私はこれを回避するための助けは必要ありません。私はすでにこのすべてに対処する簡単な方法を思いついた。私は、上記の3つの箇条書きのいずれかに欠けている簡単なことがないことを確認して、より簡単にすることを望みます。


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 KOで作業するとき、私はこれらの同じ問題のすべてを直撃している

<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

。私の意見では、ポイント1と2は単にKOの仕組みの結果です。 DOMは、観察に加入または動作するためにプロパティの値を表示するように結合 ニーズに存在しないプロパティにバインドされ

  • 。その後、そのプロパティをviewModelに追加すると、バインディングはこれが起こったことをどのように知ることができますか?
  • が計算観測可能に作成され、それが含むの機能は観測へのサブスクリプションを記録できるように、すぐに評価し、必要なときに再評価することができます計算された場合(より複雑な解決策は、ViewModelには、それ自体が観察されるオブジェクトでき​​るようにするだろうが、それはまた別の話です) 。観測値が存在しない場合(即時エラー、テストで修正可能)、計算された評価内でヒットしなかった場合は、再度評価されません。
  • -

ポイント3痛みです。私はそれがこのように行われた理由を知らない。おそらくいくつかの理由があったかもしれません。少なくとも、単にプロパティを更新し、コレクションから削除しない「更新」メソッドは便利です。

これが役に立ちます。

+0

返信いただきありがとうございます。ええ、ポイント1と2は驚くことではありません(私の質問でポイント2と同じ理由を述べました)が、ポイント3は最も厄介なようです。なぜ彼らがそうしたのだろうと想像することはできません。 –

+0

@AdamRackis - map/unmap/update機能を実装するためにBase ViewModelクラスを作成することを検討していますが、今週末にそれを見ています。 – madcapnmckay

関連する問題