Как мне обновить мой вид, когда моя модель отсортирована?

У меня есть CanJS Model.List, который я рендеринг с использованием шаблона EJS, как показано ниже:

<% this.each(function(item, index) { %>
    <% if(index < 5 ){ %>
        <li <%= (el) -> el.data("item", item) %> >
            <%= todo.attr('name') %>  (<%= todo.attr('distance') %> miles)
        </li>
    <% } %>
<% }) %>

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

$.each(branches, function(i, b) {
    console.log(i, b);
    b.bind('distance', function (x, y, z) {
        console.log("Distance", x, y, z);
        b.save();
        branches.sort();
    });

    // Async call to update distance here...
});

Призыв к sort() работает, у меня есть различные console.logs() показывая, но мой интерфейс не обновляется.

Я предполагаю, что мне нужен вид, чтобы вызвать событие, которое this.each(...) заметит.

Как мне обновить мой вид при повторной сортировке Model.List?

1 ответ

Должна быть возможность создать вычисление, которое возвращает отсортированный список:

var sortedBranches = can.compute(function() {
  var sorted = branches.slice(0);

  Array.prototype.sort.call(sorted, function(first, second) {
    return first.attr('distance') - second.attr('distance');
  });

  return sorted;
});

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

Другие вопросы по тегам