简体   繁体   English

保存模型后无法重新渲染主视图

[英]unable to re-render the backbone view after saving the model

I save the model and I get a ok response from the server side that the DB is updated. 我保存了模型,并从服务器端收到了确定数据库已更新的正确响应。 What I'm trying to do is to refetch the collection and update the view with the saved model's information. 我想要做的是重新获取集合并使用保存的模型信息更新视图。 I'm missing something minor but I just can't figure it out. 我缺少一些小东西,但我无法弄清楚。

   $(document).ready(function () {
window.App = {
    Models: {},
    Collections: {},
    Views: {}
};

window.template = function(id){
    return _.template( $('#' + id).html() );
};


// Person Model
App.Models.Person = Backbone.Model.extend({
    defaults: {
        id: null,
        question: null,
        quizid: null,
        answerid: null
    },
     url: function() {
            return 'myurl/';
        }
});


App.Collections.People = Backbone.Collection.extend({
    model: App.Models.Person,
    url: 'myurl/'

});



App.Views.People = Backbone.View.extend({
    tagName: 'ul',

    render: function(){
        this.collection.each(function(person){
            var personView = new App.Views.Person({ model: person });
            this.$el.append(personView.render().el);
        }, this);

        return this;
    }
});


App.Views.Person = Backbone.View.extend({
    tagName: 'li',
    template: template('personTemplate'),
    events: {
     "click #saveButton" : "savedata",
    },


    savedata: function(event){
        //alert(this.model.get("id") + " " + $('#title').val());
                var newModel = new App.Models.Person();
                newModel.save({id: this.model.get("id"), question: $('#title').val()}, {
                    wait : true,
                    success: function (response) {
                        alert(response.responseText);
                        },
                        error: function (model, response) {
                            alert(response.responseText);
                        }
                    }
                );
    },

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



var peopleCollection = new App.Collections.People;
peopleCollection.fetch({
    success: function(){
    var peopleView = new App.Views.People({collection: peopleCollection});
  $('body').append(peopleView.render().el);
}});


var pw = new peopleView({collection: personCollection});
pw.render();

If you want to refresh view after editing model data then you have to listen for a sync or change event and rerender the view. 如果要在编辑模型数据后刷新视图,则必须侦听syncchange事件并重新渲染视图。

App.Views.Person = Backbone.View.extend({
    initialize: function(params) {
        this.listenTo(this.model, 'sync', this.render);
    }
});

In case you are adding a brand new model then you need to add it to the collection just after creating. 如果要添加全新的模型,则需要在创建后立即将其添加到集合中。

newModel.save({id: this.model.get("id"), question: $('#title').val()} //...
this.collection.add(newModel)

and listen for add event in people view 并在人物视图中收听add事件

this.lisenTo(this.collection, 'add', this.render

App.Views.People = Backbone.View.extend({
   initialize: function(params) {
       this.listenTo(this.collection, 'add remove sync', this.render);
   },

   render: function(){
       this.$el.empty();

       this.collection.each(function(person){
            var personView = new App.Views.Person({ model: person });
            this.$el.append(personView.render().el);
        }, this);

       return this;
    }
});

Refetching whole collection is redundant in that case. 在这种情况下,重新获取整个集合是多余的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM