2015-07-21 50 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