为什么我不能用Meteor渲染这个简单的列表?

时间:2012-08-10 16:52:34

标签: javascript coffeescript meteor

这个非常简单的应用程序无效。我的清单没有显示出来。为什么?我一定错过了关于Meteor如何工作的重要信息。

recipes.html

<body>
    <h3>Recipes</h3>
    {{> recipes}}
</body>

<template name="recipes">
    <ul>
        {{#each recipes}}
            <li>{{name}}</li>
        {{/each}}
    </ul>
</template>

recipes.coffee

Recipes = new Meteor.Collection("recipes")

if Meteor.is_client
    Meteor.startup ->
        Meteor.autosubscribe(->
            Meteor.subscribe('recipes')
        )

        # THIS IS NOT WORKING
        Template.recipes.recipes ->
            return Recipes.find()

if Meteor.is_server
    Meteor.startup ->
        if Recipes.find().count() == 0
            data = [
               name: "Chocolate Chip Cookies"
            ,
               name: "Spring Rolls"
           ]

        for item in data
            Recipes.insert(item)

    Meteor.publish('recipes', ->
        return Recipes.find()
    )

错误

Uncaught TypeError: Object function (data) {
      var getHtml = function() {
        return raw_func(data, {
          helpers: partial,
          partials: Meteor._partials
        });
      };

      var react_data = { events: (name ? Template[name].events : {}),
                         event_data: data,
                         template_name: name };

      return Meteor.ui.chunk(getHtml, react_data);
    } has no method 'recipes' 

我尝试使用autopublish而没有。我在这里不理解什么?

修改

我之前发布了错误的代码,正如Jasd指出的那样。现在的代码是有问题的代码。

3 个答案:

答案 0 :(得分:1)

不应该是:

Template.recipes.recipes = ->
    return Recipes.find()

因为1.)你函数分配给Template.recipes.recipes和2.)你遍历模板recipes的列表recipes。使用密钥recipes我不需要返回另一个对象。

答案 1 :(得分:0)

应该是这个 -

Recipes = new Meteor.Collection("recipes")

if Meteor.is_client
    Meteor.startup ->
        Meteor.autosubscribe(->
            Meteor.subscribe('recipes')
        )

    # OUTINDENT
    # ASSIGNMEMT, NOT FUNCTION CALL
    Template.recipes.recipes = ->
        return Recipes.find()

if Meteor.is_server
    Meteor.startup ->
        if Recipes.find().count() == 0
            data = [
               name: "Chocolate Chip Cookies"
            ,
               name: "Spring Rolls"
            ]

            # INDENT
            for item in data
                Recipes.insert(item)

    Meteor.publish('recipes', ->
        return Recipes.find()
    )

答案 2 :(得分:0)

  1. 您需要确保分配到Template.recipe.recipes(可能是您qn中的拼写错误)

    Template.recipes.recipes = ->
      return Recipes.find()
    
  2. 您不希望在评估模板后运行的Meteor.startup执行此操作(因此它会认为Template.recipe.recipesnull) - 将其移至is_client区块的顶层,我认为一切都会好的。