我正在尝试了解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如何在浏览器中查看数据
答案 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找到的那样)
第一个答案当然是正确的订阅方式。然而,它仍然被打破。这修复了最后一部分。
张贴帮助其他可怜的灵魂......