6

Knockout のマッピング ライブラリで何が誤解されているのかを理解しようとしています。私は単純な例にそれを取り除きましたが、それでもfromJS呼び出しで失敗する可能性があります (むしろ、マップされた変数で更新されません)。

この例で根本的に間違っていることは何ですか?

// Here's my view model
var ViewModel = function() {
    this.firstName = ko.observable('first');
    this.lastName = ko.observable('last');
};

var myVM = new ViewModel();

ko.applyBindings(myVM); // Apply to Knockout (works)

myVM.lastName('maiden name'); // Test an update (works)

var newData = {firstName: 'new', lastName: 'person'};

// Try update the ViewModel
ko.mapping.fromJS(newData, myVM); //(No update, or error)

// Intended result - UI updates to 'new person'

対応するビュー:

<div class='liveExample' >   
    <p>First name: <input data-bind='value: firstName' /></p> 
    <p>Last name: <input data-bind='value: lastName' /></p> 
</div>

私のJSフィドルの例

4

2 に答える 2

11

ko.mapping.fromJSパラメーターを少しトリッキーに処理します (ここで私の回答を参照してください)。そのため、通常、2 番目のパラメーターはマッピング オプションです。

ko.mapping.fromJS(newData, {} /* mapping options */, myVM); 

JSFiddleのデモ。

于 2013-09-12T06:36:18.627 に答える
7

2 つのデータ パラメータのみを使用する方法を見つけました。

元のデータのマッピングとして ViewModel を作成してから、 を使用しますko.mapping.fromJS(data, ViewModel)

更新されたjsFiddle

説明

Knockout は、呼び出されたプロパティを使用しmappingProperty = "__ko_mapping__"て、データが以前にマップされた時期を識別します。見つかった場合は、2 番目のパラメーターをターゲット (この場合は ViewModel) として設定します。

ko.mapping.jsのデバッグ バージョンからの抜粋:

var mappingProperty = "__ko_mapping__";

[...]

if (arguments.length == 2) {
  if (arguments[1][mappingProperty]) {
    target = arguments[1];
  } else {
    options = arguments[1];
  }
} 
于 2013-09-12T08:23:51.450 に答える