5

Я пытаюсь обновить свое представление всякий раз, когда добавляю новую модель в свою коллекцию. Мой первый вопрос я автоматически добавить модель в моей коллекции, когда я сохранить эту модель, как:Collection add event listener в Backbone

PostsApp.Views.Form = Backbone.View.extend({ 
    template: _.template($('#form-template').html()), 
    render: function(){ 
     this.$el.html(this.template(this.model.toJSON())); 
    }, 
    events:{ 
     'click button' : 'save' 
    }, 

    save: function(e){ 
     console.log("is this working"); 
     e.preventDefault(); 
     var newname = this.$('input[name=name-input]').val(); 
     var newadress = this.$('input[name=adress-input]').val(); 
     this.model.save({name: newname, adress : newadress}); 
    } 


}); 

или мне все равно придется делать collection.add()

Кроме этого, чтобы увидеть новая модель на мой взгляд, я пытаюсь добавить «добавить» слушателя событий, как это:

PostsApp.Views.Posts = Backbone.View.extend({ 
    initialize: function(){ 
     this.collection.on('add', this.addOne, this); 

    }, 
    render: function(){ 
     this.collection.forEach(this.addOne, this); 
    }, 

    addOne: function(post){ 
     var postView = new PostsApp.Views.Post({model:post}); 
     postView.render(); 
     this.$el.append(postView.el); 
    } 
}); 

Это не только не работает, но когда я добавляю метод инициализации, он просто дублирует все в моей модели, когда страница сначала загружается.

ответ

13

Неа .. Когда вы делаете model.save, это будет просто создать модель зомби (если она уже не является частью .i.e коллекции Если новая модель сохраняется), которая не является частью какой-либо коллекции.

Значит, ваше событие не будет запущено для сбора.

Если вы хотите, чтобы событие добавить в срабатывать, используйте create метод сбора, который затем будет знать, на какой набор новая модель должна быть добавлена ​​..

collection.create({model}); 

Тогда это было бы внутренне добавить модель в коллекции и уволить add event

Кроме того, это лучше использовать listenTo вместо креплени событий с помощью on

this.listenTo(this.collection, 'add', this.addOne); 

Код

PostsApp.Views.Form = Backbone.View.extend({ 
    template: _.template($('#form-template').html()), 
    render: function() { 
     this.$el.html(this.template(this.model.toJSON())); 
    }, 
    events: { 
     'click button': 'save' 
    }, 

    save: function (e) { 
     console.log("is this working"); 
     e.preventDefault(); 
     var newname = this.$('input[name=name-input]').val(); 
     var newadress = this.$('input[name=adress-input]').val(); 
     this.collection.create({ 
      name: newname, 
      adress: newadress 
     }); 
    } 
}); 

PostsApp.Views.Posts = Backbone.View.extend({ 
    initialize: function() { 
     this.listenTo(this.collection, 'add', this.addOne); 

    }, 
    render: function() { 
     this.collection.forEach(this.addOne, this); 
    }, 

    addOne: function (post) { 
     var postView = new PostsApp.Views.Post({ 
      model: post, 
      collection : this.collection 
     }); 
     postView.render(); 
     this.$el.append(postView.el); 
    } 
}); 
+0

благодаря которой следует это collection.create ({модель}); быть в моем коде? –

+0

Итак, в основном вы переходите в коллекцию к 'subView' и в методе сохранения' subView' вам нужно будет использовать его –

+0

Я предполагаю, что в методе сохранения, поэтому, когда я создаю новый вид формы, я должен пройти в сбор вместо модели? –