铁路由器路由的动态查询对象

时间:2015-08-29 23:18:02

标签: meteor routing iron-router

我的当前路线如下:

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

但这似乎是不行的。

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

1 个答案:

答案 0 :(得分:0)

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

我认为你有两个选择:

  1. 将对象字符串化为网址:
  2.    
    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'});
    
相关问题