Я работаю с приложением, которое после каждого collection.fetch
мне нужно отбросить случайное объявление в DOM. Но каждый раз, когда сбор извлекается и объявление удаляется, кажется, что DOM сбрасывает себя, а не просто добавляет новые элементы в общий контейнер сбора.Marionette drop in new ItemView после каждого извлечения не работает
Вот ItemView для объявления:
define(["marionette", "lodash", "text!ads/template.html", "eventer"],
function(Marionette, _, templateHTML, eventer) {
'use strict';
var AdsView = Marionette.ItemView.extend({
template: _.template(templateHTML),
ui: {
ad: '.ad'
},
initialize: function() {
this.listenTo(eventer, 'generate:new:ad', this.generateNewAd, this);
},
onShow: function() {
// Set add image onShow
this.ui.ad.prop('src', '/ad/' + this.randomNumber());
},
generateNewAd: function(childView) {
var newAd = this.ui.ad.clone(),
element = childView.$el,
elementId = childView.model.get("id");
newAd.prop('src', '/ad/' + this.randomNumber());
$("#" + elementId).after(newAd);
},
randomNumber: function() {
return Math.floor(Math.random()*1000);
},
setUpAd: function() {
this.ui.ad.prop('src', '/ad/' + this.randomNumber());
}
});
return AdsView;
});
CompositeView, который содержит продукты (я звоню новое объявление после сбора делается sync
ING):
define(["marionette", "lodash", "text!fonts/products/template.html",
'fonts/products/item-view', 'fonts/products/model', 'eventer'],
function(Marionette, _, templateHTML, ProductItemView, ProductsModel, eventer) {
'use strict';
var ProductsView = Marionette.CompositeView.extend({
template: _.template(templateHTML),
childView: ProductItemView,
childViewContainer: '.items',
productsLimit: 150,
initialize: function() {
this.listenTo(eventer, 'sort:products', this.sortCollection, this);
this.listenTo(this.collection, 'sync', this.setupSync, this);
},
sortCollection: function(field) {
this.collection.sortByKey(field);
},
setupSync: function() {
this.setupWindowScrollListener();
this.adGeneration();
},
adGeneration: function() {
var child = this.children.last();
eventer.trigger('generate:new:ad', child);
},
productsEnd: function() {
eventer.trigger('products:end');
},
setupWindowScrollListener: function() {
var $window = $(window),
$document = $(document),
that = this,
collectionSize = that.collection.length;
if(collectionSize <= that.productsLimit) {
$window.on('scroll', _.throttle(function() {
var scrollTop = $window.scrollTop(),
wHeight = $window.height(),
dHeight = $document.height(),
margin = 200;
if(scrollTop + wHeight > dHeight - margin) {
eventer.trigger('fetch:more:products');
$window.off('scroll');
}
}, 500));
} else {
that.productsEnd();
}
},
});
return ProductsView;
});
Хм .. Интересно, стоит ли лучше всего захватить огромное количество продуктов одновременно, а затем показать их как пользовательские свитки. Просто не уверен, как это сделать – dennismonsewicz
Может быть, но имейте в виду, что большие загрузки могут быстро ухудшить работу пользователя, и при обработке рендеринга это не так уж сложно, (ваш метод 'setupWindowScrollListener' имеет много машин низкого класса необходимо), это только усложняет код. Я думаю, что то, что вы делаете сейчас, вполне приемлемо. – seebiscuit
Удивительный, спасибо! Что происходит прямо сейчас, так это то, что, когда происходит выборка, DOM повторно отображает и создается объявление и помещается после последнего дочернего элемента. Извините, если вы попытались объяснить, как исправить это несколько раз – dennismonsewicz