2014-03-31 3 views
0

Я только начал изучать backbonejs. Это некоторые из моих демо строк кода:backbonejs - Почему это содержимое модели backbonejs не меняется?

 var i = 0; 
     Player = Backbone.Model.extend({ 
      default: { 
       name : "noName", 
       HP: 100, 
       MP: 100 
      }, 
      initialize: function(){ 
       i++; 
       this.name = "Player "+i.toString(); 
       alert(this.name+" created !"); 
       this.on("change:name", function(model){ 
        var name = model.get("name"); 
        alert("Change "+this.name+ " to "+name); 
       }); 

      } 
     }); 

     var p1 = new Player({HP: 200}); 
     var p2 = new Player({MP: 200}); 
     p1.set({name: "A"}); 
     p2.set({name:"B"}); 
     p1.set({name: "A2"}); 

Теперь, что меня смутило, что, почему, когда я запускаю этот код в браузере, то появляется:

Player 1 created ! 
Player 2 created ! 
Change Player 1 to A 
Change Player 2 to B 
Change Player 1 to A2 

(почему не изменить А2 ?, потому что я уже сменил Player 1 на A?)

+0

у вас есть ошибка - не по умолчанию: {} бушель по умолчанию: {} – Evgeniy

+0

я изменил значение по умолчанию значения по умолчанию, но это не меняет вывод я буду говорить о @ @ – sonlexqt

+0

, потому что вы задаете this.name = "Player" + i.toString(); - он сохраняется в корне объекта, p2.set ({name: "B"}); - обновлять данные в хеше атрибута. – Evgeniy

ответ

2

Первая важная вещь, чтобы понять, что:

this.name = "Player "+i; 

не нравится делать:

this.set("name", "Player" + i); 

this.name просто добавив имя поля в объекте JavaScrip в то время как this.set("name", ...) меняется свойство модели магистральной линии (по назначению)

Вот мое предложение для вас код:

defaults: { 
    name : "noName", 
    HP: 100, 
    MP: 100 
}, 
initialize: function(){ 
    i++; 
    this.on("change:name", function(model){ 
    alert("Change "+model.previous("name")+ " to "+ model.get("name")); 
    }); 
    this.set('name', "Player "+ i); 
} 
0

Используйте previous, чтобы получить значение атрибута модели, которое вы изменили + правильно и правильно присвоили значение атрибута. fiddle

var i = 0; 
Player = Backbone.Model.extend({ 

    defaults: { 
     name : "noName", 
     HP: 100, 
     MP: 100 
    }, 

    initialize: function(){ 
     i++; 
     this.set('name', "Player "+i.toString()); 
     alert(this.get('name')+" created !"); 
     this.on("change:name", function(model){ 
      var prevName = model.previous("name"); 
       name = model.get("name"); 
      alert("Change "+prevName+ " to "+name); 
     }); 
    } 
}); 


var p1 = new Player({HP: 200}), 
    p2 = new Player({MP: 200}); 

p1.set({name: "A"}); 
p2.set({name:"B"}); 
p1.set({name: "A2"}); 
Смежные вопросы