流星方法clobbers订阅查询

时间:2016-02-06 21:07:01

标签: javascript meteor reactjs

我使用Meteor和React。当我加载页面时,Iron Router在集合中创建文档。然后,它使用Meteor.method查找用户的权限,并在文档中设置和更新。同时,客户端页面正在加载并运行对集合中文档的查询。

似乎Meteor.method代码在客户端上破坏了查询。通过多个查询,文档存在,我可以console.log()它。然后我突然得到了#34; undefined"。该文档仍然存在,因为我可以从另一个Meteor.call查询它。我使用过发布/订阅,但客户端无法看到它。

这里是我的一些代码(为简单起见合并了文件):

Editors = new Mongo.Collection('editors');

if (Meteor.isServer())
    Meteor.publish('editors', function (editorId) {
        return Editors.find(editorId) || this.ready();
    });

    Meteor.methods({
        setEditorMode: function (editorId, userId) {
            var editor = Editors.findOne(editorId);
            var role = Roles.find({
                doc_id: editor.manuscriptId,
                user_id: userId
            }).fetch()[0];
            var defaultEditorMode = "readOnly";

            if (role !== null && role.role == 'owner' || role.role == 'contributor') {
                defaultEditorMode = "readWriteComment";
            } else if (role !== null && role.role == 'reviewer') {
                defaultEditorMode = "readComment";
            }

            console.log(editor);
            Editors.update(editor._id, {
                $set: {
                    defaultEditorMode: defaultEditorMode,
                    editorMode: defaultEditorMode
                }
            });
            console.log(Editors.findOne(editor._id);
        }
    });
}

if (Meteor.isClient()) {
    Router.route('/documents/:id/edit', function () {
        var editorId;

        manuscriptId = this.params.id;

        this.wait(/* Doing some work */);

        if (this.ready()) {
            editorId = Editors.insert({manuscriptId: manuscriptId});
            Meteor.call('setEditorMode', editorId, Meteor.userId());
            this.render('editor', {
                data: function () {
                    return {
                        editorId: editorId
                    };
                }
            });
        } else {
            this.render('loading');
        }
    });

    Editor = React.createClass({
        mixins: [ReactMeteorData],

        componentWillMount: function () {
            Meteor.subscribe('editors', this.props.editorId);
        },

        getMeteorData: function () {
            var editor, editorId;

            editorId = this.props.editorId;
            editor = Editors.findOne(editorId);
            console.log(editor);

            return {
                editor: editor || {}
            };
        },

        render: function () {
            return <EditorContent editor={this.data.editor} />
        }
    });
}

我需要在服务器上进行更新,以便安全地进行更新。我的期望是服务器上文档的任何更新都会传播到客户端。相反,一旦我在服务器上进行更新,就会调用getMeteorData()并且查询返回&#34; undefined&#34;。

如何获取我刚在服务器上设置的值?

1 个答案:

答案 0 :(得分:0)

感谢@ ko0stick,我发现我需要将我的Meteor.subscribe代码放在getMeteorData中