【问题标题】:Passing an _id and a search query in the string在字符串中传递 _id 和搜索查询
【发布时间】:2015-03-16 21:14:14
【问题描述】:

使用 meteor 进行测试项目。在玩他们拥有的示例todo 应用程序时,无法弄清楚如何传递 ID 和搜索参数。

目前,我的铁路由器里有:

this.route('team', {
     path: '/team/:_id',
     onBeforeAction: function() {
         this.todosHandle = Meteor.subscribe('todos', this.params._id);
         // Then filter mongoDB to search for the text
 }});

问题是,我还想传递一个可选的search 参数来搜索todos。所以像path: '/team/:_id(/search/:search)?'

任何想法如何做到这一点?

【问题讨论】:

    标签: javascript regex mongodb meteor url-routing


    【解决方案1】:

    从您的解释来看,您似乎想仔细控制哪些文档实际发布给客户端,而不是发布所有文档并缩小客户端上的结果集。在这种情况下,我建议首先在服务器上定义一个发布,如下所示:

    Meteor.publish('todosByTeamIdAndSearch', function(todoTeamId, searchParameter) {
        var todosCursor = null;
    
        // Check for teamId and searchParameter existence and set
        // todosCursor accordingly. If neither exist, return an empty
        // cursor, while returning a subset of documents depending on
        // parameter existence.
        todosCursor = Todos.find({teamId: todoTeamId, ...}); // pass parameters accordingly
    
        return todosCursor;
    });
    

    如需详细了解如何定义更细化的发布,请查看this

    使用上述定义的发布,您可以像这样设置您的路线:

    Router.route('/team/:_id/search/:search', {
        name: 'team',
        waitOn: function() {
            return Meteor.subscribe('todosByTeamIdAndSearch', this.params._id, this.params.search);
        },
        data: function() {
            if(this.ready()) {
                // Access your Todos collection like you normally would
                var todos = Todos.find({});
            }
        }
    });
    

    从示例路由定义中可以看出,您可以在调用Router.route() 函数时直接按照您希望看到的方式定义路由的路径,并像在@ 中一样访问直接传入的参数987654327@ 路由选项。由于出版物已按照我的建议进行定义,因此您只需将这些路由参数直接传递给 Meteor.subscribe() 函数即可。然后,在data 路由选项中,一旦您检查了您的订阅是否准备就绪,您就可以像往常一样访问Todos 集合,如果您不需要这样做,则无需进一步缩小结果集。

    要了解有关如何配置路由的更多信息,请查看以下两个链接:Iron Router Route ParametersIron Router Route Options

    【讨论】:

    • 谢谢。但这是否意味着我需要创建 2 条不同的路线去同一个地方?
    • 那么Router.route('/team/:_id')Router.route('/team/:_id/search/:search') ?
    • 我问的原因是因为我在数据中有一些逻辑并且重复执行两次似乎是多余的......或者我在核心做错了什么......?
    • 如果您想使用查询字符串进行搜索,您可以只定义第一条路线。如果你想要一个 /search/:search 路由,你必须同时定义两者。
    • 当您说“数据中有一些逻辑”时,您的意思是您的Meteor.publish() 函数中有用于Todos 集合的逻辑来缩小结果集吗?
    【解决方案2】:

    在客户端,您只需在顶级代码中使用Meteor.subscribe('todos');'todos' 这里不是指集合,它是一个任意字符串。订阅不关心你在哪条路线上。

    在服务器上,你会有这样的发布功能:

    Meteor.publish('todos', function() {
        if (!Meteor.userId()) return;
    
        // return all todos (you could pass whatever query params)
        return Todos({});
    });
    

    然后,在您的路线定义上:

    Router.route('team', {
        path: '/team/:_id',
        data: function() {
            if (this.params.query) { //if there's a query string
                 return Todos.find(/* according to the query string */).fetch();
            else {
                 // return all the user's todos
                 return Todos.find({ uid: this.params._id }).fetch();
            }
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 2019-11-18
      • 2012-07-03
      • 1970-01-01
      相关资源
      最近更新 更多