2

我需要在我的中存储一些数据,这些数据model是 Unix 标准表示中的日期+时间(从 1970 年开始的毫秒数),但我所做的是set通过传递类似“Tue Jul 30 2013 12:25:43 GMT+0200 (CEST )”。字符串是我可以从 my 获得的,我view真的不想在我看来转换它,因为我认为这样model做是 's 的责任。通过这种方式,功能组织良好且整洁。所以:

我把它放在我的模型中:

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的其中一个验证它时:

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

这是怎么回事?在触发我在初始化中设置的事件处理程序之前执行验证。我找到了一种解决方法:将转换移动到一个新函数中,并在 .on 和验证中调用它。但我认为更整洁的东西是可能的。有什么建议吗?

4

1 回答 1

1

该值将在触发事件start_time之前进行验证。change此外,不鼓励直接设置,如果您不想触发事件,请model.attributes使用set并传递。{silent:true}change

我建议使用以下方法之一并摆脱您的事件处理程序。

在调用 set 之前进行转换:

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

就个人而言,我会选择第一种方法。

于 2013-07-30T19:21:29.370 回答