此Meteor代码中的模板帮助器.header
应该重新呈现"更新"服务器方法headerLabel
运行时属性headerUpdate
的值,但即使已使用新值更新集合,也无法显示新更新的值。
解决此问题的正确方法是什么?谢谢
Template.header.helpers({
headerLabel: function() {
var userId = Meteor.userId();
if (userId) {
Meteor.call('getHeaderLabel', userId, function(err, res) {
if (!err) {
Session.set('headerLabel', res);
}
});
return Session.get('headerLabel');
} else {
return 'Please login'
}
}
});
// on the client
Meteor.subscribe('headerLabelCol', Meteor.userId());
//on the server
Meteor.publish('headerLabelCol', function(userId) {
return HeaderLabelCol.find({userId: userId}, {limit: 1});
});
// Meteor methods
getHeaderLabel: function(userId) {
if (userId) {
var result = HeaderLabelCol.findOne({userId: userId});
if (result) { return result.headerLabel; }
}
}
headerUpdate: function(userId, headerLabel) {
HeaderLabelCol.update({userId: userId}, {$set: {headerLabel: headerLabel}});
}
修改
我使用reactive-publish软件包更改了服务器大小发布,如下所示,无效。
Meteor.publish('headerLabelCol', function (userId) {
this.autorun(function (computation) {
return HeaderLabelCol.find({userId: userId}, {limit: 1});
});
});
答案 0 :(得分:1)
解决方案1 - 使用Pub / Sub
在headerLabelCol
上发布server
:
Meteor.publish('headerLabelCol', function() { return HeaderLabelCol.find({ userId: this.userId }, { limit: 1 }); });
订阅headerLabelCol
上的client
:
Meteor.subscribe('headerLabelCol');
在Template.header.helpers
上的client
:
Template.header.helpers({ headerLabel: function() { var userId = Meteor.userId(); if (userId) { var result = HeaderLabelCol.findOne({userId:userId}); if(result) { return result.headerLabel; } else { return 'Not Found'; } } else { return 'Please login'; } } });
注意:您可以通过Collection
或Meteor.methods
更新Collection.allow
。
解决方案2 - 使用方法和会话
我尝试时你的代码正常工作。所以我不确定你出了什么问题,这就是我如何解决这个问题:
在client
和server
上定义方法。
Meteor.methods
client
和server
上的Meteor.call
:
Meteor.methods({ getHeaderLabel: function(userId) { if (userId) { var result = HeaderLabelCol.findOne({ userId: userId }); if (result) { return result.headerLabel; } else { return null; } } }, headerUpdate: function(userId, headerLabel) { HeaderLabelCol.update({ userId: userId }, { $set: { headerLabel: headerLabel } }); } }
Template.header.helpers
:
Meteor.call('getHeaderLabel', Meteor.userId(), function(err, res) { if (!err) { Session.set('headerLabel', res); } });
您可以通过Meteor.methods
(正如您所做)或headerUpdate
headerUpdate
来调用上述内容。两者都可以,但我更喜欢通过Session
来完成,如下所示:
headerUpdate: function(userId, headerLabel) { HeaderLabelCol.update({ userId: userId }, { $set: { headerLabel: headerLabel } }); Meteor.call('getHeaderLabel', userId, function(err, res) { if (!err) { Session.set('headerLabel', res); } }); }
这确保每次更新数据时都调用该方法。因此更新了reactive
getHeaderLabel
数据源,并自动调用模板助手。
模板助手:
Template.header.helpers({ headerLabel: function() { if (Meteor.userId()) { return Session.get('headerLabel'); } else { return 'Please login'; } } });
初次调用getHeaderLabel
流星方法:
Template.header.onCreated({ Meteor.call('getHeaderLabel', Meteor.userId(), function(err, res) { if (!err) { Session.set('headerLabel', res); } }); });
这将在呈现DOM之前调用static propTypes = {
elementsMap: React.PropTypes.map(React.PropTypes.string, editorPropTypes.element).isRequired,
}
方法。