2013-07-24 79 views
0

我想在添加到主干中的集合时自动生成模型属性。我做了一些搜索,但似乎无法找到任何有关如何正确处理客户端生成的时间戳的信息。我的下面的例子工作。 (但可能不是在所有情况下)有没有更好的方式与backbone.js做到这一点?下面的代码是fiddle在集合add()上添加时间戳和排序顺序字段Backbone.js

<div id="output"></div> 
//javascript 
var modelMessage = Backbone.Model.extend({ 
    levelToInt: function() { 
     switch (this.get('level')) { 
      case "error": 
       return 3; 
       break; 
      case "warning": 
       return 2; 
       break; 
      case "info": 
       return 1; 
       break; 
      default: 
       return 0; 
       break; 
     } 
    } 
}); 
var collectionMessages = Backbone.Collection.extend({ 
    model: modelMessage, 
    url: "#" 
}); 
var Messages = new collectionMessages(); 
Messages.listenTo(Messages, "add", function (model) { 
    if (!model.get('addedon')) { 
     model.set({ 
      addedon: new Date().getTime(), 
      levelcode: model.levelToInt() 
     }); 
    } 
    $('#output').append('<div>added model:' + JSON.stringify(model.toJSON()) + '</div>'); 
}); 

Messages.add({ 
    level: "info", 
    text: "Life is good." 
}); 
setTimeout(function() { 
    Messages.add({ 
     level: "warning", 
     text: "you have been warned..." 
    }); 
}, 1000); 
setTimeout(function() { 
    Messages.add({ 
     level: "error", 
     text: "OMG something really bad happened!", 
    }); 
}, 2000); 
+0

好像对模特属性添加到我一个合理的方式。为什么要添加到集合,而不仅仅是'model.initialize'?你有一个你关心的具体情况吗?客户端时间戳与服务器端不同? –

+0

我实际上想知道逻辑是否应该在模型中。我对骨干非常陌生,所以我唯一关心的情况是我还没有意识到的情况。 – Mikt25

+1

我将代码移动到模型上的init方法。 @ fbynite's现在有一个解决方案来解决这个问题。 –

回答

4

我只想建立模型,以便每当创建它,你给它一个时间戳。所以,我将在下面添加到模型:

var modelMessage = Backbone.Model.extend({ 
    defaults: function() { 
    return { 
     addedon: new Date().getTime() 
    }; 
    }, 
    // ... the rest of your code 
}); 

然后改变Messages.listenTo调用下面还有:

Messages.listenTo(Messages, "add", function (model) { 
    model.set({levelcode: model.levelToInt()}); 
    $('#output').append('<div>added model:' + JSON.stringify(model.toJSON()) + '</div>'); 
}); 

这里是一个小提琴:http://jsfiddle.net/xUyak/

或者安德鲁提到的以下也可以工作:

var modelMessage = Backbone.Model.extend({ 
    initialize: function() { 
    this.set({ 
     addedon: new Date().getTime(), 
     levelcode: this.levelToInt() 
    }); 
    }, 
    // ... the rest of your code 
}); 

然后你会在Message.listenTo省略model.set

Messages.listenTo(Messages, "add", function (model) { 
    $('#output').append('<div>added model:' + JSON.stringify(model.toJSON()) + '</div>'); 
}); 
+0

谢谢fbynite。这就是我一直在寻找的东西。 – Mikt25