2013-07-24 25 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