我有一個集合使用transform來實例化類中的文檔。然後這些實例設置了新的屬性,從第三方apis獲取數據並作出反應。對變換後的集合進行排序
現在,我需要根據檢索反應數據的方法對這些對象進行排序。但是我不能做一個集合find.sort,或者使用collection-hooks,因爲它在對文檔進行轉換之前對其進行操作,因此該方法不可用。
因此,在我看來,基於不在mongo中的數據對該集合進行排序的唯一方法是重寫UI.each元素並在其中添加排序。但是我對流星很陌生,並不知道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()
在模板中檢索已變換元素。你如何在這種情況下使用observe()?因爲在這種情況下,反應性會丟失,地址不會更新。
以前:
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