方法集合更新在客户端模板上不响应

时间:2016-03-27 20:56:24

标签: meteor

此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});
 });
});

1 个答案:

答案 0 :(得分:1)

两种解决方案

解决方案1 ​​ - 使用Pub / Sub

  1. headerLabelCol上发布server

    Meteor.publish('headerLabelCol', function() {
        return HeaderLabelCol.find({
            userId: this.userId
        }, {
            limit: 1
        });
    });
  2. 订阅headerLabelCol上的client

    Meteor.subscribe('headerLabelCol');
  3. 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';
            }
        }
    });
  4. 注意:您可以通过CollectionMeteor.methods更新Collection.allow

    解决方案2 - 使用方法和会话

    我尝试时你的代码正常工作。所以我不确定你出了什么问题,这就是我如何解决这个问题:

    clientserver上定义方法。

    1. Meteor.methods clientserver上的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
                 }
              });
          }
      }
    2. Template.header.helpers

      Meteor.call('getHeaderLabel', Meteor.userId(), function(err, res) {
          if (!err) {
              Session.set('headerLabel', res);
          }
      });
    3. 您可以通过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);
              }
          });
      }
    4. 这确保每次更新数据时都调用该方法。因此更新了reactive getHeaderLabel数据源,并自动调用模板助手。

      1. 模板助手:

        Template.header.helpers({
            headerLabel: function() {
                if (Meteor.userId()) {
                    return Session.get('headerLabel');
                } else {
                    return 'Please login';
                }
            }
        });
      2. 初次调用getHeaderLabel流星方法:

        Template.header.onCreated({
            Meteor.call('getHeaderLabel', Meteor.userId(), function(err, res) {
                if (!err) {
                    Session.set('headerLabel', res);
                }
            });
        });
      3. 这将在呈现DOM之前调用static propTypes = { elementsMap: React.PropTypes.map(React.PropTypes.string, editorPropTypes.element).isRequired, } 方法。