订阅在Deps.autorun中时,使用Meteor订阅句柄的.ready()函数作为反应源

时间:2013-12-19 00:35:18

标签: javascript meteor publish-subscribe reactive-programming

所以我在Deps.autorun订阅,我想跟踪订阅何时仍在加载文档以及何时完成或“准备好”。

我想在Meteor.Subscribe方法返回的句柄上使用.ready()函数作为把手助手中的被动数据源。这适用于第一次订阅。但是当Deps无效并且重新运行订阅时,不会重新运行把手模板。

我认为这是因为订阅句柄上的.ready()没有得到验证。换句话说,为把手助手创建的依赖关系是在旧的.ready()被动元素上,当重新运行Deps.autorun并重新设置订阅时,会有一个新的句柄,并且把手助手不依赖于这个新的.ready()函数。

我的解决方法是在Deps.autorun中创建一个设置为false的会话变量,然后将onReady回调函数传递给订阅,该订阅将该会话变量设置为true。

这是我的原始代码,仅适用于第一个订阅。

var searchResultsHandle = null;

Deps.autorun(function () {
    searchResultsHandle = Meteor.subscribe("searchResults", Session.get('searchQuery'));
});

Handlebars.registerHelper("searchResultsLoaded", function() {
    return searchResultsHandle && searchResultsHandle.ready();
});  

我的解决方法:

var searchResultsHandle = null;

Deps.autorun(function () {
    Session.set('searchResultsLoaded', false);
    searchResultsHandle = Meteor.subscribe("searchResults", Session.get('searchQuery'), function(){
        Session.set('searchResultsLoaded', true);
    });
});

Handlebars.registerHelper("searchResultsLoaded", function() {
    return Session.equals('searchResultsLoaded', true);
});

这是解决问题的正确方法吗?有没有办法继续使用.ready()函数作为响应数据源并以这种方式重新订阅?

0 个答案:

没有答案