2015-07-21 55 views
1

我有以下的服务器:流星:为什么我的订阅不起作用?

items.allow({ 
'insert': function (userId,doc) { 
    return true; 
} 
}); 


Meteor.methods({ 
getChildren: function(parentId) { 
       var children = items.find({parent: parentId}); 
       console.log("children: "+children.count()); 
       Meteor.publish(parentId, function() { 
        console.log("publishing to : "+parentId); 
        return children; 
       }); 
       return true; 
} 
}); 

上可用于服务器和客户端collections.js继...

items = new Mongo.Collection("folders"); 

接下来,客户端具有如下:

Meteor.startup(function() { 
    items.insert({name: "HelpDocs", parent: "DocumentsA"}); 
    items.insert({name: "Code", parent: "DocumentsA"}); 
    items.insert({name: "Unit Tests", parent: "DocumentsA"}); 
}); 

Template.fileTree.events({ 
    'click .mainfolders': function (e, t) { 
    var elemId = e.currentTarget.id; 
    var children = null; 
    Meteor.call('getChildren',elemId, function(error, result){ 
     console.log("subscribing"); 
     var start = new Date().getTime(); 
     children = Meteor.subscribe(elemId, function() { 
      Session.set(elemId, true); 
      console.log("subscribed"); 
      var end = new Date().getTime(); 
      console.log(end - start); 
     }); 
     Meteor.setTimeout(function() { 
       children.forEach(function(child) { 
        console.log("rendering"); 
        Blaze.render(Template.fileTree, $('#'+elemId).get(0)); 
       }); 
      Meteor.stop(elemId); 
     }, 800); 
    }); 
    } 
}); 

它在children.for每个失败,以下例外...

[日志]在异常回调的setTimeout:http://0.0.0.0:3000/Site/client/filetree.js?83d0c4ebb8e92bb0e03e82f52ea4c0510cc0d831:21:35(meteor.js,线888) withValue @http://0.0.0.0:3000/packages/meteor.js?43b7958c1598803e94014f27f5f622b0bddc0aaf:955:21 http://0.0.0.0:3000/packages/meteor.js?43b7958c1598803e94014f27f5f622b0bddc0aaf:435:54 http://0.0.0.0:3000/packages/meteor.js?43b7958c1598803e94014f27f5f622b0bddc0aaf:983:27

订阅是准备好内的800毫秒超时我设置。我给光标错误吗?

回答

1

Meteor.subscribe()不返回游标。根据文档,它“返回一个提供stop()和ready()方法的句柄。”

相反的:

children = Meteor.subscribe(elemId, function() { 
     Session.set(elemId, true); 
     console.log("subscribed"); 
     var end = new Date().getTime(); 
     console.log(end - start); 
    }); 

你可以尝试像(未经测试):

Meteor.subscribe(elemId, function() { 
     Session.set(elemId, true); 
     console.log("subscribed"); 
     var end = new Date().getTime(); 
     console.log(end - start); 

     children = items.find(); 
    }); 
+0

谢谢!工作。流星文档或博客永远不会编写完整的代码。匆忙写下的步骤并没有给出完整的图片。非常感谢! – Ram