Meteor集合始终在客户端上返回undefined

时间:2014-04-01 07:27:14

标签: javascript meteor iron-router

我是流星的新手,并一直试图通过探索流星书来学习框架。我有一些问题,了解我的应用程序究竟发生了什么(在https://github.com/Themitchell/Sound-wav.es找到)。

基本上,我的理解是,在我的服务器端,我允许某些集合的发布,这些集合从我的客户端订阅调用中获取参数。对于我服务器上的这部分,我在我的server / publications.js文件中有这个:

Meteor.publish('studios', function (options) {
    return Studios.find({
        userId: this.userId
    }, options);
});

Meteor.publish('studio', function (id) {
    return id && Studios.find({
        userId: this.userId,
        _id: id
    });
});

接下来,我们需要一个控制器来处理路由并处理等待所需的任何订阅,然后,一旦订阅准备好(因此waitOn),就将渲染模板提供数据功能作为反应数据源。模板。

然后我设置了我的2条索引工作室的路线,并展示了一个使用铁路由器和“控制器”的工作室。如下:

StudiosIndexController = RouteController.extend({
    template: 'studiosIndex',
    increment: 20,
    limit: function () {
        return parseInt(this.params.studiosLimit) || this.increment;
    },
    findOptions: function () {
        return {
            sort: this.sort,
            limit: this.limit()
        };
    },
    waitOn: function () {
        return Meteor.subscribe('studios', this.findOptions());
    },
    studios: function () {
        return Studios.find({}, this.findOptions());
    },
    data: function () {
        return {
            studios: this.studios()
        };
    }
});

ShowStudioController = RouteController.extend({
    template: 'showStudio',
    waitOn: function () {
        return Meteor.subscribe('studio', this.params._id);
    },
    studio: function () {
        return Studios.findOne(this.params._id);
    },
    data: function () {
        return {
            studio: this.studio()
        };
    }
});

Router.map(function () {
    this.route('studiosIndex', {
        path: '/',
        controller: StudiosIndexController
    });

    this.route('showStudio', {
        path: '/studios/:_id',
        controller: ShowStudioController
    });
});

现在这很棒,在显示我的索引页面时工作正常。我得到了一个反应性的集合列表,当我向集合中引入新的工作室时,我看到它们分别在服务器和客户端上创建。但是在我的show视图中,当渲染视图时,数据似乎总是为空。在使用调试器进入我的show controller的数据功能时,我尝试查询工作室,即使我尝试获取所有可能的内容,也始终返回undefined。奇怪的是,我知道我的出版物正在记录工作室的正确ID(使用console.log)。似乎我得到了所有正确的数据,直到客户端的路由。参数id都是正确的,但是对studio的find()调用总是不返回任何内容。我错过了一些明显的东西。

值得注意的是,我删除了我的工作室'工作室'和' studio'在views / studios / index.js和views / studios / show.js中,我的理解是这就是我在控制器中对工作室和工作室做的事情。这些助手现在在控制器级别定义并传递给反应性数据'功能。这是对的吗?

TL; DR

使用上面的代码,我的索引操作可行但是我的show动作失败,数据函数总是返回undefined,实际上在show页面上我无法访问我的任何工作室信息(Studios.find({})。 ()总是返回0)。我不确定这两条路线是如何不同的。有谁能发现这个问题?

编辑:还有值得注意的是,我已经尝试过使用this.ready()了解了github上的一些铁路由器问题。第一次运行路由时,我点击数据,这是假的,但是甚至包裹我的数据助手等待this.ready()得到一个未定义的返回值,当this.ready()返回true时。

额外备注 我运行流星0.8.0与铁路由器的最新0.7.0版本和简单架构的集合2,以防你感兴趣/需要此信息。

编辑:可能的解决方案 所以摆弄它似乎是我的助手是问题。通过使用' studio'部分然后在我的数据函数中调用this.studio()这似乎打破了。如果我更改以下代码:

ShowStudioController = RouteController.extend({
    template: 'showStudio',
    waitOn: function () {
        return Meteor.subscribe('studio', this.params._id);
    },
    studio: function () {
        return Studios.findOne(this.params._id);
    },
    data: function () {
        return {
            studio: this.studio()
        };
    }
});

到这个

ShowStudioController = RouteController.extend({
    template: 'showStudio',
    waitOn: function () {
        return Meteor.subscribe('studio', this.params._id);
    },
    data: function () {
        return Studios.findOne(this.params._id);
    }
});

我的视图再次正确呈现。我不确定我在哪里看到这种模式,但我已经假定了分配给工作室'基本上和做

一样
Template.showStudio.helpers({
    studio: function () {
        return Studios.findOne(this.params._id)
    }
});

但似乎没有!

0 个答案:

没有答案