0

バックボーンのコレクションに追加されたときに、モデル属性を自動的に生成したいと考えています。いくつかの検索を行いましたが、クライアント側で生成されたタイムスタンプを正しく処理する方法に関する情報が見つからないようです。私の次の例はうまくいきます。(ただし、すべての状況でそうであるとは限りません) 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);
4

1 に答える 1

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/

または、Andrew が述べたように、以下も同様に機能します。

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

次に、 in を省略model.setMessage.listenToます。

Messages.listenTo(Messages, "add", function (model) {
  $('#output').append('<div>added model:' + JSON.stringify(model.toJSON()) + '</div>');
});
于 2013-07-24T21:27:56.060 に答える