不明白为什么meteorjs发布不更新

时间:2013-07-26 18:37:55

标签: meteor

我正在尝试了解meteorjs发布和订阅。我写了一个动态发布函数:

Meteor.publish("customers",function(f) {
  var re=null;
  if ('undefined' !== typeof f) {
    re = new RegExp("^"+f,"i");
  }
  return customers2.find({$and: [{shipto: {$ne:""}}, {shipto: {$regex: re}}]},{sort: {shipto:1}});
});

这使得所有客户都以某个字母开头。

然后我在创业时订阅:

Meteor.subscribe("customers","");

显示所有客户。现在,我的客户页面上有一个指向此事件功能的输入框:

function filterCustomers(e,t) {
  var f = $(e.target).val();
  Meteor.subscribe("customers",f);
}

新订阅似乎根本不更新客户列表。

然后我在启动时尝试了

Meteor.subscribe("customers",Session.get("customer_filter"));

,这在过滤函数中:

function filterCustomers(e,t) {
  var f = $(e.target).val();
  Session.set('customer_filter',f);
}

但更新会话变量不会更新发布。

我已将订阅放在Deps.autorun中,但这没有帮助。

我正试图避免将我的整个客户数据库发送到网上。为什么订阅永远不会更新?你有什么需要做的?我对发布和订阅有什么不了解?


按照以下建议,提取出一个简单的应用程序:

Customers = new Meteor.Collection("customers");

if (Meteor.isClient) {

Session.setDefault("customer_filter","");

Deps.autorun(function () {
  Meteor.subscribe('customers',Session.get('customer_filter'));
});

Template.customers.events({
  'click .dof' :function(e,t) {
    Session.set("customer_filter", $(e.target).attr("find"));
  }
});

Template.customers.customers = function() {
  return Customers.find();
}

Template.customers.currentFilter = function() {
  return " | "+Session.get("customer_filter");
};

}

if (Meteor.isServer) {
// Publish complete set of lists to all clients.
  Meteor.publish('customers', function (filter) {
    var re=null;
    if (filter) {
      re = new RegExp("^"+filter,"i");
     }
     return Customers.find({$and:[{shipto: {$ne:""}},{shipto: {$regex: re}}]},{sort:{shipto:1}});
  });

}

和模板

<body>
  {{> customers}}
</body>

<template name="customers">
  <h2>Customer List {{currentFilter}}
  <div id="custom-search-form" class="form-search form-horizontal pull-right">
    <div class="input-append">
        <input type="text" class="search-query span6" placeholder="Search">
        <button type="submit" class="btn"><i class="icon-search"></i></button>
    </div>
</div>
</h2>
<button find="" class="dof">ALL</button>
<button find="f" class="dof">F</button>
<button find="g" class="dof">G</button>
<button find="h" class="dof">H</button>
<button find="i" class="dof">I</button>
<button find="j" class="dof">J</button>

<table class="table table-striped" border=1>
  <thead>
  <tr>
    <th>Ship To</th>
    <th>Address</th>
    <th>Attn</th>
      </tr>
    </thead>
    <tbody>
    {{#each customers}}
      <tr>
        <td>{{shipto}}</td>
        <td>{{address}}, {{city}}, {{state}} {{zip}}</td>
        <td>{{attn}}</td>
      </tr>
    {{/each}}
    </tbody>
  </table>
</template>

非常奇怪的行为。按钮不会更新数据。如果我更改了一些代码,服务器会刷新,有时我会得到一个更新。然后更多按钮点击但没有UI更改。尝试在点击处理程序中添加Deps.refresh但没有运气。

看起来只修改服务器代码确实会强制刷新...可能是UI问题而不是数据问题? PS如何在浏览器中查看数据

2 个答案:

答案 0 :(得分:1)

订阅的正确方法是:

Deps.autorun(function(){
    Meteor.subscribe('customers', Session.get('customer_filter'));
});

如果你已经尝试了这个并且它不起作用,那么错误就在其他地方。


为了使反应性起作用,您需要两件事:自动运行上下文和反应数据源。

自动运行上下文是一种监视一个或多个依赖项的函数,只要其中一个发生更改,就会重新运行。在这种情况下,它由Deps.autorun函数提供。

反应数据源是一个能够通知上下文它已更改其值的对象。在上面的例子中,它是Session变量。

你不能只与这些因素中的一个产生反应,使一个函数自动重新运行,你需要提供这两个因素。

答案 1 :(得分:1)

感谢邮件列表:

Avital Oliver Jul 27 10:04 AM -0700

尝试{shipto:re}而不是{shipto:{$ regex:re}}。 (我认为这是一个错误 我们两天前在devshop找到的那样)

第一个答案当然是正确的订阅方式。然而,它仍然被打破。这修复了最后一部分。

张贴帮助其他可怜的灵魂......