В моей команде я единственный человек, который ежедневно работает в Ember. Никто не мешает мне делать очень глупые вещи — вещи, которые могут сделать приложение излишне медленным или сложным. Может быть, это одна из тех вещей. А может и нет.

Сегодня я узнал, что могу использовать .property() в конце Ember.computed.sort, чтобы убедиться, что объекты перебираются на основе изменений ввода поиска. В большинстве случаев, если вы хотите отсортировать записи Ember Data Store, примеры в Документах — это все, что вам нужно. Вам ДЕЙСТВИТЕЛЬНО следует сначала просмотреть их. Но мой вариант использования был немного другим, и, возможно, ваш тоже.

Вот что я сделал и почему:

// in my-component.js
sortedItems: Ember.computed.sort('items', 
  function(itemA, itemB) {
    let searchTerm = this.get('searchTerm');
    // countSearchHits is a function I wrote elsewhere   
    let aCount = this.countSearchHits(searchTerm, itemA)
    let bCount = this.countSearchHits(searchTerm, itemB)
    if (aCount < bCount) {
      return 1;
    } else if (aCount > bCount) {
      return -1;
    }
    return 0;
  }).property('searchTerm') // THIS LINE IS THE MAYBE A BAD THING

У меня есть параметр запроса searchTerm. Всякий раз, когда поисковый термин изменяется, набор элементов должен рассчитываться и пересортировываться в зависимости от того, сколько раз этот термин появляется в каждом элементе. Но в отличие от обычного свойства Ember.computed, которое может отслеживать множество различных объектов на предмет изменений, Ember.sort принимает только два аргумента: коллекцию, по которой вы выполняете итерацию, и определение сортировки или обратный вызов. Итак, как я могу убедиться, что эта функция запускалась каждый раз при изменении условия поиска? Здесь я использовал .property(), который является более старой формой Ember.computed(). Я считаю, что эту старую форму несколько не рекомендуется использовать, но я не уверен, почему, кроме того, действительно трудно определить, когда вы работаете над чужим кодом в первый раз. Вот пост Переполнение стека, который меня подсказал, и документация по .property().

Обратный вызов, который принимает sort, показался мне немного странным, когда я впервые посмотрел на него, но я не делаю здесь ничего особенного. Чтобы понять вычисляемую сортировку Ember, я счел полезным просмотреть документацию по старой доброй функции сортировки JavaScript. Возврат -1, 1 или 0 определяет, как упорядочиваются объекты. Если сортировка не работает, возможно, вы перепутали операторы, которые должны возвращать положительное или отрицательное значение 1. Попробуйте перевернуть их. Вот пример псевдокода из MDN, который помог мне понять, что делать:

function compare(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}

Если вы знаете, как в Ember 2+ лучше выполнять сортировку, не связанную строго с сортировкой в ​​алфавитном порядке по атрибуту, напишите мне!