【问题标题】:dynamic query object for iron-router routeIron-router 路由的动态查询对象
【发布时间】:2015-08-30 08:35:32
【问题描述】:

我的当前路线如下:

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

但这似乎是不行的。

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

【问题讨论】:

  • 没有客户端 POST,因此您可以传递给客户端路由的数据受限于您可以放入 URL 中的内容(类似于 GET 请求)。所以,不,我不这么认为。您仅有的两个选择是将 JSON 对象字符串化到 URL 中(如果对象很小),或者使用全局变量或会话变量。

标签: meteor routing iron-router


【解决方案1】:

没有客户端 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'});

【讨论】:

  • 谢谢,这肯定回答了我的问题,现在一切正常。另一个快速的。为什么我需要“Session.set”。实际上,在我使用 Session.set 方法之前,仅在我的文件之间使用全局对象是行不通的。我不确定为什么会这样,我认为一个文件中的 query_object = {} 对所有人都是全局的......也许我错了?
  • 嗯,我也这么认为。我通常更喜欢 Session 变量,因为它们是反应式数据源。但是我知道当不需要反应性时,也有一种使用全局变量的方法。不知道为什么它在你的情况下不起作用。你在全局范围内定义了query_object = {},对吗? (即,直接在文件中,而不是在块中)
  • 好吧,我以为我做到了:P。当您试图弄清楚为什么某些东西不起作用并左右更改代码时,谁知道我错过了什么……尽管我可能错过了一些东西。感谢您的帮助!
  • 不客气。如果您不介意,也请考虑对答案进行投票。
猜你喜欢
  • 2015-02-16
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
相关资源
最近更新 更多