Knockout.Mapping - 当我使用自定义映射时如何取消映射?

时间:2013-07-31 05:42:54

标签: knockout.js knockout-mapping-plugin

我使用knockout.mapping插件就像这样不必获取moment对象而不是蹩脚的日期:

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/

1 个答案:

答案 0 :(得分:2)

我知道这并不严格地回答如何自定义取消映射本身的问题,但我发现处理这种情况的一种有用方法是将原始数据包装在observables中,但添加计算的observables(sub-observables) )给观察者自己。最好用一个例子说明......

JSBin showing moment added as sub-observable on Birthdate

关键代码段在这里......

    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时,将保留原始结构。诀窍是你实际上需要将时刻存储回计算中(使其与包含在observable中的原始数据同步)...

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());
相关问题