Backbone.js: как принудительно обновить представление при изменении коллекции моделей - PullRequest
6 голосов
/ 05 января 2012

Итак, у меня есть вид, который выглядит следующим образом.

    //base class
    var SelectListView = Backbone.View.extend({
        initialize: function() {
            _.bindAll(this, 'addOne', 'addAll');
            this.collection.bind('reset', this.addAll);
        },
        addAll: function() {
            this.collection.each(this.addOne);
        },
        events: {
            "change": "changedSelected"
        },
        changedSelected: function() {
            this.selected = $(this.el);
            this.setSelectedId($(this.el).val());
        }

    });

    //my extended view
    var PricingSelectListView = SelectListView.extend({
        addOne: function(item) {
            $(this.el).append(new PricingView({ model: item }).render().el);
        }         
    });

Я создал экземпляр вида, подобного этому ...

var products = new ProductPricings();
var pricingsView = new PricingSelectListView({
     el: $("#sel-product"),
     collection: products
});

Где-то еще (другой вид - пользовательский метод) Iобновили коллекцию представления цены

pricingsView.collection = new ProductPricings(filtered);

Это ничего не делает, чтобы сделать что-либо.

pricingsView.render();

Так что теперь в коллекции меньше элементов, но новое представление никогда не отображается и не обновляется вDOM.

Как мне сделать 1.) обновить рендеринг в DOM?2.) Сделать это автоматически обновить DOM?Должен ли я как-то указывать, чтобы он отображался при изменении коллекции?

Ответы [ 2 ]

4 голосов
/ 05 января 2012

Вы связали addOne() с событием reset.Когда вы просто заменяете экземпляр pricingsView.collection, это событие не вызывается и addOne() не выполняется.

Попробуйте вместо этого:

pricingsView.collection.reset(filtered);
3 голосов
/ 05 января 2012

Это может работать, так как вы уже привязываетесь к событию сброса коллекции:

pricingsView.collection.reset(filtered);

http://backbonejs.org/#Collection-reset

У вас все еще есть настройка логики рендеринга для удаления старой разметки из представления, когда происходит сброс.

...