在执行Collection转换之前获取服务器方法结果

时间:2014-02-12 05:19:41

标签: coffeescript meteor

使用CoinsManager,我有一个模板目录,每个文件都有一个类,我想阅读并列出我的集合转换方法中的所有文件,用正确的类初始化我的文档。

服务器/ methods.coffee

Meteor.methods
  implemented_coins: ->
    """
    Returns a list of coins that have been implemented
    """
    files = fs.readdirSync './app/models/cryptos/'
    file.replace(".coffee.js", "") for file in files.filter (file) ->
      file.search("(base_crypto*)|(js.map)") == -1

集合/ addresses.coffee

if Meteor.isReady
  @implementedCoins = Meteor.call "implemented_coins"

@Addresses = new Meteor.Collection "addresses",
  transform: (doc) ->
    # Retrieve class from code, and pass it the address
    if doc.code in @implementedCoins
      new @[doc.code] doc.address
    else doc

客户端/视图/地址/ addresses_list.coffee

Template.userAddresses.helpers
  userAddresses: ->
    addresses = Addresses.find
      userId: Meteor.user()._id
    address.set_balance() for address in addresses
    return addresses

现在,我在客户端控制台上收到以下错误:

Exception from Deps recompute: TypeError: Array.prototype.indexOf called on null or undefined
    at indexOf (native)
    at Addresses.Meteor.Collection.transform

这意味着在我的集合转换中,@implementedCoins变量未定义,因为我没有正确实现它。

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我很确定这是错误的:

if Meteor.isReady
  @implementedCoins = Meteor.call "implemented_coins"

我不认为Meteor中有一个字段具有该名称,即使它是,但它会在启动时执行,但那时isReady可能是假的,所以你的变量没有设置。你是说Meteor.startup吗?其次,在客户端上,您需要使用call的回调,因为客户端上没有光纤。

这会改变吗?

Meteor.startup(function () {
    Meteor.call("implemented_coins", function(err, res) { 
         implementedCoins = res; 
    });
});