1

Мне комфортно с функцией comparator в Backbone.Collection, и мне также нравится идея сортировки коллекции, а затем перерисовка всего объекта из представления. Однако я не ищу этого здесь.Повторно вставить модель в вид сортированной коллекции после редактирования

У меня есть коллекция, которая была отсортирована (при загрузке). Один вид прослушивает сборник и отвечает за его повторение через «сброс». У моделей коллекции есть свое представление. Здесь нет ничего необычного.

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

В идеале, я должен иметь возможность удалить измененную модель из представления коллекции, а затем снова вставить ее в новое, соответствующее положение в виде коллекции (так что я делаю только одно удаление DOM и одно дополнение DOM - вместо очистки, а затем перерисовки всей коллекции моделей). Я мог бы, конечно, сделать это вручную, без какой-либо помощи позвоночника, но я подумал, что спрошу, есть ли какие-либо черты позвоночника, которые могли бы сделать его проще или, по крайней мере, более упорядоченным. Выполнение этого полностью вне позвоночника кажется взломом, и оно не будет выглядеть красиво.

+0

Я не совсем понимаю ваш вопрос, но что вы подразумеваете под «очистить всю коллекцию»? Почему вы не можете вызывать 'sort' в коллекции, когда ваш признанный атрибут изменяется и прослушивает событие' sort' в вашем представлении коллекции и вызывает 'render'? – fbynite

+0

Я отредактировал вопрос, чтобы попытаться сделать его более понятным. Это действительно проблема с представлением, а не проблема сбора/сортировки. Очевидно, я не смог объяснить себя должным образом. Надеюсь, теперь это лучше. – EleventyOne

+0

Итак, вы спрашиваете об изменении порядка сортировки элементов DOM? – kinakuta

ответ

1

Думаю, я знаю, к чему вы клоните. Если у вас есть доступ к моделям и взглядов в вопросе, вот основной подход:

// assumption: this is called on "change" event, only once 
re_insert_item : function(model,m_view,collection,c_view) { 

    // remove the model's view from the DOM 
    m_view.$el.remove(); 

    // assuming there is a comparator, sort() will move the 
    // model into the correct position of the collection. since 
    // we're not doing a .remove and .add, we have to sort manually 
    // (as per documentation instructions) 
    collection.sort(); 

    // figure out the model that, based upon its sort position, our 
    // edited model will come *before* 
    var idx = collection.indexOf(model); 
    var next_model = collection.at(idx+1); 

    // insert our model's view into the DOM right above it's neighbour 
    // this assumes you have some way to get a view for a given model, 
    // which there isn't really a "standard" way to do (it seems) 
    if (next_model) { 
     var next_m_view = ??? // assume you have some way to get this 
     next_m_view.$el.before(m_view.render().$el); 
    } 

    // this model is last in the list, so just append it to the 
    // collection view (assuming the collection view houses the 
    // master list as its $el) 
    else { 
     c_view.$el.append(m_view.render().$el); 
    } 
} 

Вы должны изменить кучу его в зависимости от: а) если вы планируете поместить код - то есть, где/как вы получите параметры функции; б) как ваши модели и взгляды связаны друг с другом.

Был (несколько) аналогичный вопрос, заданный here на SO. Однако, в отличие от ответа, который я выделил с помощью вышеуказанной ссылки, я предпочитаю не использовать код обхода DOM, если я могу его избежать, вместо этого полагаясь на упорядочение коллекции магистрали.

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

+0

Epic. Ответ. Большое спасибо за подробный ответ! Поэтому, я думаю, я просто буду ссылаться на представление каждой модели в самой модели. – EleventyOne

+1

Добро пожаловать! :) Что касается ссылок на модель/просмотр, это не очень хороший способ сделать это. Проверьте [this] (http://stackoverflow.com/questions/11473898/find-a-backbone-js-view-if-you-know-the-model) SO-поток для некоторых идей. –