iron-router 路由的动态查询对象

dynamic query object for iron-router route

我目前的路线如下:

Router.route('/:arg',   function(){
    this.render('tmpResults', {
        data:   function(){
            return hcDrefs.find({name: {$regex: this.params.query.q}})
        }
    });
}, {name: 'showSome'});

如您所见,查询被硬编码为实际上只接受一个输入(请参见下面的块)。我想要做的是执行这条路线,其中查询对象需要是可变形式......有时我只需要一个简单的查询,其他时候,查询可能包含一个 AND 操作。我目前将这条路线称为:

    Router.go('showSome', {arg: 1},
              {query: '?q=' + e.target.value});
}

...我想知道的是我是否可以通过某种方式将某种查询对象传递给路由,但我似乎还没有找到有效的语法...甚至不确定是否可以能行得通。我尝试了一些蛮力的东西,比如定义一个查询对象:

query_object = {name: {$regex: pattern}}

并尝试以某种方式将其发送到路由器:

    Router.go('showSome', {arg: 1},
              {query: query_object});
}
//----------------------------------------------------------
    Router.route('/:arg',   function(){
        this.render('tmpResults', {
            data:   function(){
                return hcDrefs.find(this.params.query.q}})
            }
        });
    }, {name: 'showSome'});

但这似乎行不通。

在生成数据上下文的查询可以是可变形式的情况下,设置路由数据上下文的好方法是什么?我认为全局对象可能会起作用,但我很好奇是否有一种更具战略意义的方式通过路由器。我仍在通过铁路由器文档挖掘我可以挂钩的东西。

没有客户端 POST,因此您可以传递到客户端路由的数据受限于您可以放入 URL 的数据(类似于 GET 请求) .所以,不,我认为没有更优雅的解决方案。

我想你有两个选择:

  1. 将您的对象串入 URL:
Router.go('showSome', {arg: 1},
          {query: JSON.stringify(query_object)});

//----------------------------------------------------------

Router.route('/:arg',   function(){
   this.render('tmpResults', {
       data:   function(){
           return hcDrefs.find(JSON.parse(this.params.query)}})
       }
   });
}, {name: 'showSome'});

2) 使用全局或会话变量:

Session.set('query', query_object);
Router.go('showSome', {arg: 1});
//----------------------------------------------------------

Router.route('/:arg',   function(){
    this.render('tmpResults', {
        data:   function(){
            return hcDrefs.find(Session.get('query'))}})
        }
    });
}, {name: 'showSome'});