1

私はノックミーアウトで単純なエディター パターンに従ってきましたが、ネストされたオブジェクトを使い始めるまで、すべてが期待どおりに機能していました。

基本的に、アイテムを選択すると、ビューモデルに 2 つのプロパティが設定されます。selectedItemプロパティとプロパティeditable。次に変更を加えるのは、編集可能なプロパティです。ユーザーが変更を受け入れると、選択したアイテムが更新されます。

フラットオブジェクトがある場合、これは私のコードでうまく機能します。ただし、ネストされたオブジェクトがある場合、編集可能なプロパティに割り当てられたときに子オブジェクトのデータが正しくありません。

私は見る必要があります:

"Selected": {
    "Id": 1,
    "Name": "user 1",
    "Role": {
      "Id": 2,
      "RoleName": "IT Support"
    }
  },
  "Editable": {
    "Id": 1,
    "Name": "user 1",
    "Role": {
      "Id": 2,
      "RoleName": "IT Support"
    }

しかし、私は得る:

"Selected": {
    "Id": 2,
    "Name": "user 1",
    "Role": {
      "Id": 3,
      "RoleName": "IT Procurement"
    }
  },
  "Editable": {
    "Id": 2,
    "Name": "user 1",
    "Role": {
      "Id": 2,
      "RoleName": "IT Support"
    }

selectItem メソッドに渡された詳細オブジェクトをログに記録すると、データが正しいことがわかります。編集可能なプロパティに割り当てられたとき、それは正しくないようです。

これがあまり明確でない場合はお詫び申し上げます。ここに私のフィドルへのリンクがあります

4

1 に答える 1

0

あなたが抱えている問題はselect、エディターでのバインディングによるものです。ノックアウトは、現在の値が有効な選択であることを確認するか、最初のエントリに設定します。あなたの場合、編集可能なコピーには、EmployeeRoles配列内のアイテムへの同じ参照がありません。それらは同じように見えますが、同じ基準ではないため、互いに等しくありません。

簡単な修正は、次のようなことを行うことです。

self.SelectEmployee = function(e){
    self.Selected(e);
    var copy = ko.toJS(e);
    copy.Role = e.Role(); //get the actual reference
    self.Editable(new Employee(copy));
    self.isOpen(true);
};

そのため、 を使用ko.toJSしてクリーン コピーを作成しますが、実際の参照をコピーに貼りRole付けます。

更新されたサンプル: http://jsfiddle.net/rniemeyer/rVYrB/

あなたのサンプルは、ポップアップ ダイアログでこのパターンを使用する良い例です。

于 2013-07-24T13:41:15.443 に答える