2014-11-28 2 views
0

В моем магистральном приложении, у меня есть модель, которая выглядит немного как это,Backbone события изменения не стреляя, когда некоторые атрибуты меняются

{ 
    "id" : 145, 
    "name" : "Group Number 1", 
    "information" : "Some kind of blurb about group number 1", 
    "members" : {[ 
     "id" : 1, 
     "first_name" : "John", 
     "last_name" : "Doe", 
     "email" : "[email protected]" 
    ]} 
} 

Теперь, если я бег this.model.get('members').add(newUser) новый пользователь будет добавлен в коллекцию членов в моей модели - однако она не запускает событие изменения, почему это? Купите все же, если я изменю имя модели, то происходит событие изменения?

Все это делается с целью, которая выглядит так,

вид Индивидуальная модель

Views.OrganisationView = Backbone.View.extend({ 

    tagName: 'div', 
    className:'group group--panel col-sm-3', 

    template : _.template($('#tpl-single-group').html()), 

    events: { 
     "click a[data-type=organisation], button[data-type=organisation]" : "edit", 
     "click .js-delete-group" : "removeOrganisation", 
    }, 

    initialize: function() { 
     this.model.on("error", function(model, xhr, options){ 
      console.log(model, xhr, options); 
      console.log(this); 
     }); 
     this.listenTo(this.model, 'change', this.render); 
     this.listenTo(this.model, 'destroy', this.removeView); 
    }, 

    render: function() { 
     this.$el.html(this.template({ 
      group: this.model.toJSON() 
     })); 

     return this; 
    }, 

    removeView: function() { 
     this.remove(); 
    }, 

    removeOrganisation: function(e) { 
     this.model.destory(); 
     this.remove(); 
    }, 

    edit: function(e) { 
     e.preventDefault(); 
    Routes.Application.navigate('/organisation/edit/' + this.model.get('id'), { trigger: false }); 
     var editClient = new Views.OrganisastionEditView({ 
      model: this.model 
     }); 
    } 

}); 

Второе заблуждение вещь, что событие запроса выкинут, (имеет смысл рассматривать как будто я я сохраняю модель, но событие ошибки также выбрасывается, но ошибок нет xhr, и я в настоящее время не проверяю модель?

Вот как я сохраняю u Ser для сбора членов в моей модели,

var member = new Pops.Models.User({ id: element.data('id') }); 
member.fetch({ 
    success:function() { 
     self.model.get('members').add(member); 
     var model = self.model; 
     self.$('.search').hide(); 
     self.$('button').show(); 
     var projectMember = new Pops.Views.UserInitialsWithAdmin({ 
      model: member 
     }); 
     self.model.save({validate:false}); 
     self.$('.search').parent().append(projectMember.render().el); 
     self.$('.search').remove(); 
    } 
}); 
+1

Существует немного путаницы с декларированием моделей и коллекций в вашем примере. В первом примере атрибут 'members' объекта - это еще один объект javascript, а не' Backbone.Collection', поэтому мне интересно, как вы называете 'add' на нем. И для вашего второго вопроса - он работает как ожидалось. Событие 'request' будет вызываться при вызове' Backbone.sync' (инициируется 'model.fetch'). И если '$ .ajax' терпит неудачу, он вызовет обратный вызов ошибки. –

ответ

0

(я предполагаю, что первый бит кода, который вы дали всего лишь руководство того, что простой JSON представление модели будет выглядеть, и что members является реальный Collection с использованием метода add.)

В ответ на первый вопрос: события изменения меняются только при изменении атрибута модели с использованием set. В вашем случае вы добавляете в коллекцию, хранящуюся в атрибуте members, но атрибут members по-прежнему содержит ссылку на ту же коллекцию, что и раньше, что означает, что с точки зрения Магистра этот атрибут не изменился. Я бы предложил добавить слушателей непосредственно в коллекцию members. Также см. How can I "bubble up" events on nested Backbone collections?.

В целом, модели гнездования в базовой линии не являются прямыми, так как Jeremy Ashkenas has pointed out. Часто бывает лучше оставить модели плоскими и хранить ссылки на связанные модели в виде массивов идентификаторов, которые затем могут быть извлечены по мере необходимости.

Смежные вопросы