1

安っぽい日付の代わりに瞬間オブジェクトknockout.mappingを取得する必要がないように、プラグインを次のように使用します。

var mappedPeople = ko.mapping.fromJS(people, {
    Birthdate: {
        create: function(op) {
            return ko.observable( moment( new Date(op.data) ) );
        }
    }
});

涼しい。

さて、変更を加えた後、配列全体を通常の js に戻したいと思います。の仕事のようですko.mapping.toJSね!

しかし、どうすれば日付に戻ることができますか? toJSオプション オブジェクトを使用しているようですが、これに役立つオプションが見つからないようです。

更新: moment.js を使用する特定のシナリオでは、文字列を強制して再ラップすることでこの問題を回避する方法があることを認識しています。根本的な問題は、カスタムの「マッピング解除」機能をプラグインに提供する方法です。

更新 2 : 問題を示す jsbin は次のとおりです: http://jsbin.com/uzesag/1/

4

1 に答える 1

2

これは厳密に言えば、マッピング解除自体をカスタマイズする方法の質問に答えるものではないことはわかっていますが、このタイプの状況を処理する便利な方法は、元のデータをオブザーバブルでラップし、計算されたオブザーバブル (サブオブザーバブル) をオブザーバブルそのもの。例で最もよく説明されています...

Birthdate に subobservable として追加された瞬間を示す JSBin

キースニペットはここにあります...

    var mappedPeople = ko.mapping.fromJS(people, {
      Birthdate: {
          create: function(op) {

              var observable = ko.observable(op.data);

              // Attach computed to 'Birthdate' that produces moment
              observable.moment = ko.computed({
                read: function() {
                  return moment( new Date(observable()) );
                },
                write: function(val) {
                  observable(val.toDate().toISOString());
                }
              });

              return observable;      
          }
      }
  });

つまり、ko.mapping.toJS または ko.mapping.toJSON を呼び出すと、元の構造が保持されます。秘訣は、実際に瞬間を計算されたものに戻す必要があることです(オブザーバブルにラップされた元のデータと同期させるため)...

function VM() {
  this.mapped = mappedPeople;

  // read moment computed
  var moment = this.mapped()[0].Birthdate.moment();

  // manipulate
  moment.add(5, 'y');

  // set it back
  this.mapped()[0].Birthdate.moment(moment);

  // unmapping 
  this.unmapped = ko.mapping.toJSON(this.mapped);
}

ko.applyBindings(new VM());
于 2016-02-23T04:41:40.370 に答える