2013-07-30 35 views
2

我需要在我的model中存儲一些數據,這些數據是Unix標準表示(1970年以來的毫秒)中的日期+時間,但我所做的是通過傳遞字符串「Tue Jul 30 2013 12:25:43 GMT + 0200(CEST)「。字符串是我可以從我的view中獲得的字符串,我不想在我看來轉換它,因爲我認爲這是model的義務。通過這種方式,功能組織良好,整潔。所以:數據處理+驗證的最佳做法

我把這個在我的模型:

initialize: function() { 
    var self= this; 

    //conversion of the string date into milliseconds 
    this.on("change:start_time", function(model, start_time) { 
     if(start_time !== null){ 
      var data= new Date(start_time); 
      self.attributes.start_time= data.valueOf(); 
     } 
    }); 
... 

,它就像一個魅力。問題是,當你要設置的start_time屬性,並在同一時間從我view S的一個驗證它:

this.model.set({ 
    start_time: startDatePicker.getLocalDate() 
}, {validate : true}); 

這裏有什麼事? 驗證是在我設置的事件處理程序在初始化之前執行的,觸發。我找到了一個解決方法:將轉換移動到一個新函數中,並在.on和驗證中調用它。但我覺得有些更新是可能的。任何建議?

回答

1

start_time將在change事件觸發前被驗證。此外,如果您不希望激活change事件,則不鼓勵直接設置model.attributes,而使用set並通過{silent:true}

我建議以下方法之一,擺脫你的事件處理程序。

調用集之前做轉換:

var dt = new Date(startDatePicker.getLocalDate()).valueOf(); 
this.model.set({ 
    start_time: dt 
}, {validate : true}); 

如果你堅持你的模型會進行轉換,另一種選擇是壓倒一切的set方法在你的模型:

var Model = Backbone.Model.extend({ 
    set:function(key,val,options) { 
    var attrs; 

    // from Backbone source 
    if (typeof key === 'object') { 
     attrs = key; 
     options = val; 
    } else { 
     (attrs = {})[key] = val; 
    } 

    if (attrs['start_time']) 
     attrs['start_time'] = new Date(attrs['start_name']).valueOf(); 

    Backbone.Model.prototype.set.call(this,attrs,options); 
} 
// your existing code 
}); 

就個人而言,我會選擇第一種方法。

+0

是的,我已經考慮過您提到的第一種方法,但我個人認爲您正在分散功能,應該卡在模型類中,而不是視圖中。 – Bertuz

+0

第二個是非常酷的,它允許我一點一點地發現骨幹下的什麼東西!謝謝! – Bertuz

相關問題