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

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

JSBin 显示在 Birthdate 添加为 sub-observable 的时刻

关键片段在这里...

    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());
于 2016-02-23T04:41:40.370 回答