Meteor:如何为同一页面上的不同模板订阅不同的出版物?

时间:2016-04-03 05:25:47

标签: mongodb meteor iron-router

我有两个模板,我想在同一页面上呈现。一个是列出最近项目的模板;另一个列出了$ text搜索结果的项目。

每个模板的数据来自单独的订阅。问题是,minimongo不支持$ text搜索,因此一旦返回订阅,我就不能使用$ text来限制客户端的结果。这是一个问题,因为两个订阅在客户端混合在一起,所以我的搜索结果和最近的项目结果看起来都很奇怪,因为它们都是从两个订阅中抽取的。

我正在尝试使用Iron Router来指定哪个模板订阅哪个发布。但是,我的代码不起作用。

  1. 在服务器上,文件app.js,两个单独的出版物:

    if (Meteor.isServer) {
    
    
    Meteor.publish("myitems", function () {
        return Items.find();
    });
    
    Items._ensureIndex({
        "itemName": "text",
        //"tags" : "text"
    });
    
    
    Meteor.publish("search", function (searchValue) {
        if (!this.userId) {
            this.ready();
            return;
        }
        return Items.find(
            {
                createdBy: this.userId,
                $text: {$search: searchValue},
                retired: {$ne: true}
            },
            {
    
                fields: {
                    score: {$meta: "textScore"}
                },
                sort: {
                    score: {$meta: "textScore"}
                }
            }
        );
    });
    
    
    }
    
  2. 客户端代码:

    • 最近项目模板的帮助:

      Template.myitems.helpers(
      {
          items: function () {
      
              var d = new Date();
              var currentUser = Meteor.userId();
              return Items.find(
                  {
                      createdBy: currentUser,
                      createdAt: {
                          $gte: new Date(d.setDate(d.getDate() - 30))
                      }
                  },
                  {
                      sort: {
                          createdAt: -1
                      },
                      limit: 5
                  });
          }
      

      });

    • 搜索结果模板的帮助:

      Template.searchResults.helpers({     searchitems:function(){         if(Session.get(“searchValue”)){             return Items.find({             },{                 sort:{“score”: - 1,“itemName”: - 1},                 //限制:10             });         } else {             // return Items.find({});         }     } }); }

    • 每个模板的onCreated订阅,单独:

      Template.myitems.onCreated (function () {
      
          Meteor.subscribe('myitems');
      });
      
      Template.searchResults.onCreated (function () {
      
          Meteor.subscribe('search');
      
      });
      
  3. 路由器控制器配置:是的你会看到它也尝试订阅,但无论如何它都会失败,因此没有重复订阅“myitems”

    itemsController = RouteController.extend({
        //waitOn: function() {
        //    return [
        //        Meteor.subscribe('myitems')
        //    ];
        //},
        //data: function() {
        //    //return { items : Items.find({}), item_id : this.params._id }
        //    return {items: Items.find()};
        //},
        action: function() {
            this.render('items');
            this.render('searchitems', {to: 'region1'});
            this.render('myitems', {
                to: 'region3',
                waitOn: function() {
                    return [
                        Meteor.subscribe('myitems')
                    ];
                },
                data: function(){
    
                    return {items: Items.find()};
                }
            });
    
        }
    });
    
  4. 上述铁路由器代码不会尝试订阅搜索出版物。它试图订阅最近的项目('myitems')发布,但不知何故返回的“项目”是空的。该问题不是由于发布中的任何错误设置,因为注释掉的代码有效:如果它被取消注释,那么“items”会返回并且不为空,即使我不使用onCreated来订阅它。

    我的问题是:

    1. 上面的代码出了什么问题?我知道“铁路由器”的订阅“myitems”失败了。 “myitems”的订阅在“onCreate”中成功,但搜索结果也来自“myitems”,而不是仅从“searchResults”中提取。

    2. 假设我可以修复上面的代码,Iron Router就是解决原始问题的方法:搜索结果订阅和最近的项目订阅需要分开,尽管这两个模板要呈现在同一个网页?

0 个答案:

没有答案