2013-07-31 27 views
1

我使用knockout.mapping插件,像這樣不具備獲得moment對象,而不是蹩腳的日期: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的特定場景中,有辦法通過脅迫字符串和重新包裝來解決這個問題,其根本問題是如何提供自定義的「unmapping 「功能插件。

更新2:這裏是一個jsbin演示該問題:http://jsbin.com/uzesag/1/

+2

這將有助於查看更多代碼。您能否擴展一下以創建一個工作示例?你提到的toJS方法似乎是一個很好的選擇,爲什麼它不起作用? – Jeroen

+1

你能舉一個你得到的東西和你想要的東西的例子嗎? –

+0

@Jeroen在這裏你們去了:http://jsbin.com/uzesag/1/ –

回答

1

我知道這是不是嚴格意義上講回答如何自定義刪除映射自身的問題,但我找到應對這種類型的有效途徑的情況是將原始數據封裝在可觀測數據中,但是將可計算的觀測數據(子觀測數據)添加到觀測數據本身。用一個例子最好的說明......

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時,原始結構被保留。訣竅是,您實際上需要將時間存儲回計算器(以使其與可觀察的原始數據同步)...

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());