У меня есть коллекция, которая использует преобразование для создания экземпляров документов из классов. Затем эти экземпляры устанавливают новые атрибуты, данные извлекаются из 3-й части apis и становятся реактивными.Сортировка коллекции после преобразования
Теперь мне нужно отсортировать эти объекты на основе метода, который извлекает реактивные данные. Но я не могу выполнить сборку find.sort или использовать hook-hook, потому что он работает с документом перед его преобразованием, поэтому метод недоступен.
Поэтому мне кажется, что единственный способ сортировать эту коллекцию на основе этих данных, которая не находится в монго, - это переопределить элемент UI.each и добавить туда сортировку. Но я довольно недавно знаком с Meteor и не знаю, как работает UI.each и как переопределить его для реализации этого метода сортировки.
Ниже упрощенный пример из моего кода:
модели
class @BaseCrypto
constructor: (@address) ->
@keys =
balance: "Processing..."
@deps = {}
ensureDeps: (key) ->
if not @deps[key]
@deps[key] = new Deps.Dependency()
@set_balance()
get_balance: ->
"""Retrieve value set from @set_balance()"""
@ensureDeps "balance"
@deps.balance.depend()
return @keys.balance
set_balance: (url, lambda_balance) ->
cls = this
Meteor.call "call_url", url, (err, result) ->
if err
throw new Meteor.Error err.error, err.reason
else
cls.keys.balance = lambda_balance result
cls.deps.balance.changed()
коллекция
@Addresses = new Meteor.Collection "addresses",
transform: (doc) ->
doc = BaseCrypto doc.address
doc.set_balance url, lambda_balance
return doc
хелперов
Template.coinsManager.helpers
donationAddresses: ->
Addresses.find {}
шаблон
template(name="coinsManager")
div
div.addresses
{{#each donationAddresses}}
{{> addressItem}}
{{/each}}
Как я могу получить {{#each}}
сортировать свои адреса в зависимости от их метода get_balance()?
Редактировать
Мы можем сделать fetch()
на запрос коллекции в шаблоне для получения преобразованных элементов. Как вы используете функцию watch() в этом случае? Потому что в этом случае реактивность теряется и адреса не обновляются.
Перед:
donationAddresses: ->
coinsManager = Meteor.users.findOne
"emails.address": "[email protected]"
if coinsManager
Addresses.find
userId: coinsManager._id
после:
donationAddresses: ->
coinsManager = Meteor.users.findOne
"emails.address": "[email protected]"
if coinsManager
addresses = Addresses.find
userId: coinsManager._id
addresses = addresses.fetch().sort (a, b) ->
a = a.get_balance()
b = b.get_balance()
if not _.isNumber a
a = -1
if not _.isNumber b
b = -1
b - a
return addresses
Не будучи слишком знакомым с API, можно каким-то образом разместить аргументы в вашем .find в помощнике. Таким образом, сортировка может происходить на стороне сервера, а не на том, что может быть беспорядочным видом на стороне клиента. Пока ваша модельная реализация доступна с сервера, который является –
. Самая большая проблема, которую я вижу при таком подходе, заключается в том, что ваша функция преобразования выполняет вызов AJAX. Каждый из документов, возвращаемых курсором, получит свой собственный вызов AJAX, что очень неэффективно. Вы всегда можете «сортировать» в своем помощнике шаблонов, что может показаться неэффективным, но не таким, как проблема AJAX. – sbking
Не могли бы вы предоставить дополнительную информацию о том, какие данные API сторонних разработчиков вы извлекаете? – sbking