Meteor显示从collections.find()返回的数据.fetch()

时间:2015-03-02 10:58:07

标签: meteor

我正在尝试通过服务器方法运行下面显示的查询,遗憾的是,此查询返回的数组中的数据未显示在我的模板中,我在这里缺少什么/做错了?

/server/methods.js

Meteor.methods({
    'getCategoriesEx': function () {        
        return Categories.find({children: {$size: 0}},{sort: {name: 1}}).fetch();
    }
});

/client/categories.js

Template.Categories.rendered = function() {
};
Template.Categories.helpers({
    categories: function() {       
        Meteor.call('getCategoriesEx', function(error, list){
            if(error)
                return alert(error.reason);
            return list;
        });
    }
})

/client/categories.html

<div class="col_half">
    <label for="categories"> categories </label>
        <select id="categories" name="categories" class="sm-form-control">
        <option value="">-- Select One --</option>
        {{#each categories}}
            <option value="{{_id}}">{{name}}</option>
        {{/each}}                                       
    </select>
</div>

查询返回的数据:

[Object, Object, Object, Object]
0: Object
_id: "Pwmd9wFTf8zs8nbWn"children: Array[0]title: "A1"__proto__: Object
1: Object
2: Object
3: Object

2 个答案:

答案 0 :(得分:1)

您没有在助手中使用被动数据源。通过发布数据对其进行重组以使用客户端响应式迷你mongo查询。

这样的事情: 服务器:

Meteor.publish("categories", function() { return Categories.find(); } 

客户:

Template.Categories.created = function() {
    Meteor.subscribe("categories");
};
Template.Categories.helpers({
    categories: function() {       
        return Categories.find({children: {$size: 0}},{sort: {name: 1}});
    }
})

答案 1 :(得分:0)

克里斯的答案是做事的标准方式,但是你已经明确表示你正试图使用​​一种方法,所以我认为这是有原因的。

问题在于你的助手在被调用的时候没有返回任何内容(它调用方法并立即返回)。在回调回调时,没有什么可以将数据返回到。

一种解决方案是更新反应变量。例如,使用Sessions对象。

另请注意,可以经常调用帮助程序。每次调用帮助程序时,您可能并不真正想要调用服务器方法。放置它的更好的地方是渲染的代码。所以(未经测试):

Template.Categories.rendered = function() {       
    Meteor.call('getCategoriesEx', function(error, list){
        if(error)
            alert(error.reason);

        Session.set('categories', list);
    });
}

Template.Categories.helpers({
    categoriesResult: function() {
        return Session.get('categories')
})

<div class="col_half">
    <label for="categories"> categories </label>
    <select id="categories" name="categories" class="sm-form-control">
        <option value="">-- Select One --</option>
        {{#each categoriesList}}
            <option value="{{_id}}">{{name}}</option>
        {{/each}}                                       
    </select>
</div>