BackboneJs - должны ли модель или коллекция иметь представление о себе - PullRequest
2 голосов
/ 18 января 2012

В одном из примеров, которые я выбрал из SO-ответов здесь и во многих примерах BackBoneJ, я вижу, что функция initialize знает, с каким представлением будет отображаться модель. Я не знаю, что сейчас я немного предвзят, это хорошая практика или зависит от типа разрабатываемого приложения.

Пример

http://jsfiddle.net/thomas/Yqk5A/

Отредактированная скрипка

http://jsfiddle.net/Yqk5A/187/

Ссылка на код

FriendList = Backbone.Collection.extend({
    initialize: function(){
        this.bind("add", function( model ){
            alert("hey");
            view.render( model );
        })
    }
});

Вышеуказанная хорошая практика или ниже

var friendslist = new FriendList;
var view = new FriendView({el: 'body'});
friendslist.bind("add", function( model ){
            alert("hey" + model.get("name"));
            view.render( model );
        })

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

Ответы [ 2 ]

2 голосов
/ 18 января 2012

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

var app = {};
app.evt = _.extend({}, Backbone.Events);  // adding a global event aggregator 

FriendList = Backbone.Collection.extend({
    initialize: function(){
        this.bind("add", function( model ){
            alert("hey");
            app.evt.trigger('addfriend', model);
        })
    }
});

//further in your code you can bind to that event
app.evt.bind("addfriend", function(model){
    var view = new FriendView({el: 'body'});
    view.render(model);
});

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

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

1 голос
/ 18 января 2012

Я не думаю, что коллекция должна знать о представлении, которое используется для ее визуализации. Я знаю, что в моих проектах одна и та же коллекция визуализируется несколькими способами, поэтому такой подход быстро ухудшается.

Обычно я передаю коллекцию представлению, которое отображает коллекцию, и представление будет прослушивать добавление / удаление / обновление событий коллекции для визуализации элементов. Представление коллекции будет иметь представление о дочернем представлении.

Проверьте следующую ссылку (3-й блог в серии) и, в частности, UpdatingCollectionView. Это подход, который я нашел полезным.

http://liquidmedia.ca/blog/2011/02/backbone-js-part-3/

...