2015-06-06 2 views
0

У меня есть Marionette (2.4.1) CompositeView, и когда я делаю что-то подобное, он повторно отображает весь вид, а не childView. Значки заголовка вернутся назад. Я мог бы исправить их при рендеринге, но есть ли способ, которым я могу просто сделать childView?Marionette CompositeView Сортировка рендеринга

diaryEntries = Backbone.Marionette.CompositeView.extend({ 
    template : diaryEntries, 
    className: 'diary-entries', 
    collection: new Diary(), 
    childViewContainer: 'tbody', 
    reorderOnSort: true, 

    events: { 
    'click th[data-sort]': 'sort', 
    'click .pagination a': 'paginate' 
    }, 

    initialize: function() { 
    this.itemsPerPage = 5; 
    this.currentPage = 1; 
    this.pages; 
    }, 

    ... 

    sort: function(e) { 
    var $th, dir, sort, sorted; 
    e.preventDefault(); 
    $th = $(e.currentTarget); 
    sort = $th.data('sort'); 

    if (sort === this.collection.sortField) { 
     this.collection.sortDirection *= -1; 
    } else { 
     this.collection.sortDirection = 1; 
    } 

    this.collection.sortField = sort; 

    $('span.glyphicon').removeClass('active-sort'); 
    $th.siblings('th').find('span.glyphicon').removeClass('glyphicon-chevron-down glyphicon-chevron-up').addClass('glyphicon-sort'); 

    if (this.collection.sortDirection === 1) { 
     $th.find('span.glyphicon').removeClass('glyphicon-chevron-down glyphicon-sort').addClass('glyphicon-chevron-up active-sort'); 
    } else { 
     $th.find('span.glyphicon').removeClass('glyphicon-chevron-up glyphicon-sort').addClass('glyphicon-chevron-down active-sort'); 
    } 

    this.collection.sort(); 
    }, 
... 

}); 

ответ

2

Ну, похоже, что Марионет была обеспокоена тем же, что и вы. Я не мог найти это в документах, но это довольно просто в источнике. Если вы пройдете этот вариант:

reorderOnSort: true 

в вашей коллекции/Composite зрения, на 'sort' случае Collection/View не будет повторно вынести, только своих детей.

Смотрите эту строку в источнике марионеток: https://github.com/marionettejs/backbone.marionette/blob/v2.4.1/src/collection-view.js#L166

UPDATE Если фильтрация ваши взгляды детей, работает то на вашей коллекции будет вызывать render на Collection/CompositeView. Логика заключается в том, что если вы разбиваете страницы на своих детей, вы должны отсортировать оригинальную, нефильтрованную коллекцию, чтобы правильно отображать разбитые на страницы результаты.

Тем не менее, я ничего не вижу по существу не работает с разбиением на страницы с фильтром.

К счастью, его легко переопределить метод sort для визуализации результатов фильтрации или нет. На вас Collection/CompositeView включает этот метод:

reorder: function() { 
    var children = this.children; 
    var models = this._filteredSortedModels(); 

    // get the DOM nodes in the same order as the models 
    var els = _.map(models, function(model) { 
    return children.findByModel(model).el; 
    }); 

    this.triggerMethod('before:reorder'); 
    this._appendReorderedChildren(els); 
    this.triggerMethod('reorder'); 
    } 
}, 
+0

Всегда хорошо читать код. – billjamesdev

+0

Я уже устанавливаю это. Это не работает. – jabbermonkey

+0

Вы фильтруете свой список? – seebiscuit