【问题标题】:Retrieving a display results from a search从搜索中检索显示结果
【发布时间】:2014-12-16 20:38:56
【问题描述】:

我对meteor.js 比较陌生,我正在尝试使用搜索表单。到目前为止,我什至还没有尝试让参数工作,但它会稍后出现。

我基本上是想展示一堆升降机。

lib/router.js

Router.configure({
  layoutTemplate: 'layout',
  loadingTemplate: 'loading',
  notFoundTemplate: 'notFound',
  waitOn: function() {
    return Meteor.subscribe('lifts');
  }
});

Router.route('/', { name: 'liftsList' });

Router.route('/lifts/search/:from-:to-:when', {
  name: 'liftsSearch',
  waitOn: function() {
    return Meteor.subscribe('liftsSearch');
  }
});

server/publications.js

Meteor.publish('liftsSearch', function() {
  var query = { fromLoc: { $near : { 
    $geometry: { 
      type : "Point" ,
      coordinates: [ 6.11667, 45.9 ]
    } },
    $maxDistance : 50
  }};

  return Lifts.find(query);
});

如果我尝试使用 Lifts.find(query).fetch() 显示结果,它会返回实际结果。

client/lifts_search.html

<template name="liftsSearch">
  <div class="container">
    <h3>Lifts search results {{hi}}</h3>
    <div class="lifts">
      {{#each lifts}}
        hi
        {{> liftItem}}
      {{/each}}
    </div>
  </div>
</template>

在这里,我根本没有显示电梯,甚至没有小“hi”字符串。

谢谢

【问题讨论】:

    标签: javascript node.js meteor iron-router


    【解决方案1】:

    除非您没有包含代码,否则{{#each lifts}} 不会呈现,因为您没有在任何地方定义lifts。仅仅因为您正在填充 Lifts 集合,模板不会自动知道 lifts 引用它(主要是因为这完全是任意的 - 它会引用什么确切的查询?)。

    因此,您需要在路由器data function 中定义lifts

    Router.route('/lifts/search/:from-:to-:when', {
      name: 'liftsSearch',
      waitOn: function() {
        return Meteor.subscribe('liftsSearch');
      },
      data: function() {
        return {
          lifts: Lifts.find() // add a query if you want
        }
      }
    });
    

    或者template helper

    Template.liftsSearch.helpers({
      lifts: function() {
        return Lifts.find(); // add a query if you want
      }
    });
    

    【讨论】:

    • 那么在路由器中 Meteor.subscribe('liftsSearch') 和 Lifts.find() 之间的确切关系是什么? subscribe 函数是否返回一个 minimongo 实例,然后 Lift.find() 在这个 minimongo 实例中进行查询?
    • subscribe 函数要求服务器发送与该出版物名称相关的文档,publish 函数会这样做,使用 Lifts.find(query) 来确定是哪个。但是,仅仅因为这些现在已经填充了 minimongo,并不会自动使它们可用于模板。为此,您必须在客户端进行查询并在帮助程序/路由器数据函数中返回结果。如果不是这样,您将不得不订阅每个单独的客户端查询,这将对服务器造成惩罚。
    • 我明白,但问题是如果我在服务器端(发布)执行 fetch(),我发现我只有两个元素,无论是在客户端 Lift.find( ) 只是检索所有元素。
    • 你删除了autopublish吗?
    • 除非我遗漏了什么,这实际上是两个问题? 1 - 客户端find 返回的比您发布的多。 2 - 模板不呈现电梯列表。对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2021-02-23
    • 2021-09-24
    • 2016-06-26
    • 2023-04-07
    • 2013-01-14
    • 2014-01-20
    相关资源
    最近更新 更多