我使用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;。
如何获取我刚在服务器上设置的值?
答案 0 :(得分:0)
感谢@ ko0stick,我发现我需要将我的Meteor.subscribe代码放在getMeteorData中