1

问题描述:

我有两个系列videosspecs. videos集合有一个名为的键spec,它对应于一个specs id. 两个集合都不为空。

我的模板助手:

  Template.List.helpers({
    videos: function(){
      var vids = Videos.find({ online: false}).fetch();
      return vids.map(function(value){
        console.log("id: " + value.spec);
        console.log(Specs.find({ id: value.spec }).fetch());

        //Issue here
        value.specName = Specs.find({ id: value.spec }).fetch()[0].name;
        return value;
      });
    }
  });

正如您在我的模板助手中看到的那样,我循环遍历视频数组并添加specName到数组中。

主要问题来自这一特定行:

value.specName = Specs.find({ id: value.spec }).fetch()[0].name;

更具体地说,这一行:每次Specs.find({ id: value.spec }).fetch() 都会返回。null

我试过的:

自然,我的第一个想法是检查value.spec返回的内容。它返回一个介于 1 和 15(包括在内)之间的 int,这是正确的。如果value.spec是对的,那么为什么find()不返回任何东西?

然后我决定硬设置它并尝试了这个:

Specs.find({ id: 2}).fetch()

这奏效了。这很奇怪,因为多次value.spec返回 2...

我也尝试过intParse(value.spec)以防万一,但这也没有用。

问题

为什么在Specs.find({ id: value.spec }).fetch()知道value.spec设置正确并且硬编码数字有效的情况下返回 null?

请求的json数据:(来自meteor mongo)

眼镜:

{ "_id" : "XKXHtQuiFsAew3dDy", "id" : 1, "name" : "Endocrine surgery" }
{ "_id" : "68jFidAMXTXpQtQye", "id" : 2, "name" : "General and digestive" }
{ "_id" : "GZSXToRXMfJgnH3CY", "id" : 3, "name" : "Pediatric surgery" }
{ "_id" : "T2mBz2gsXEqQaybmq", "id" : 4, "name" : "Thoracic surgery" }
{ "_id" : "hnuQzZiPKvYYDZhc8", "id" : 5, "name" : "Equipment" }
{ "_id" : "byE3A6HchvfhKdmR8", "id" : 6, "name" : "Gynecology" }
{ "_id" : "u5rrPB7asGW3NC6B2", "id" : 7, "name" : "Urology" }
{ "_id" : "umxKvR66oEx5dRppf", "id" : 8, "name" : "Cardiovascular surgery" }
{ "_id" : "bPcBTZn3t5ubRRcrQ", "id" : 9, "name" : "Endoscopic surgery" }
{ "_id" : "yNyAqQPoreNtdRZ34", "id" : 10, "name" : "NOTES" }
{ "_id" : "KG794eakRaztEqehG", "id" : 11, "name" : "Robotic surgery" }
{ "_id" : "QBrtvTg4GT7Tf7cAJ", "id" : 12, "name" : "Skull base surgery" }
{ "_id" : "HEhq6oBjuuMnrxE5a", "id" : 13, "name" : "Arthroscopy and upper limb surgery" }
{ "_id" : "xwpgHqZpBQP7WAnd5", "id" : 14, "name" : "Single port surgery" }
{ "_id" : "K4BgFupwNdDGD3449", "id" : 15, "name" : "Telemicrosurgery" }

视频:

{ "_id" : "L5Qi7YRRhn6Sfcjk8", "id" : "vd01en1065e", "title" : "Right inguinal hernia: open plug technique", "authors" : [ "E Pelissier" ], "date_published" : "2004-09-27", "abstract" : "", "tags" : [ "" ], "spec" : 2, "private" : true, "online" : false }
{ "_id" : "M8cuLW6KNCqKeP9vF", "id" : "vd01en1074e", "title" : "Laparoscopic splenectomy, posterior approach", "authors" : [ "D Mutter", " F Rubino" ], "date_published" : "2004-09-27", "abstract" : "", "tags" : [ "" ], "spec" : 2, "private" : true, "online" : false }
{ "_id" : "Ptzrxw8GifeMvQk9k", "id" : "vd01en1090e", "title" : "Intussusception of the intestine in the newborn", "authors" : [ "F Becmeur", " D Christmann", " I Kauffmann" ], "date_published" : "2004-09-27", "abstract" : "", "tags" : [ "" ], "spec" : 3, "private" : true, "online" : false }
{ "_id" : "oHWcX3vCBHuZQM9hR", "id" : "vd01en1103e_2", "title" : "Appendicular peritonitis: laparoscopic conversion", "authors" : [ "B Navez" ], "date_published" : "2001-11-05", "abstract" : "", "tags" : [ "" ], "spec" : 2, "private" : true, "online" : false }
{ "_id" : "6uzmxYxhd5DDuS2gG", "id" : "vd01en1108e", "title" : "Diaphragmatic hernias", "authors" : [ "F Becmeur" ], "date_published" : "2001-11-28", "abstract" : "", "tags" : [ "" ], "spec" : 3, "private" : true, "online" : false }
{ "_id" : "yHqruiQYeeQ9SDHpH", "id" : "vd01en1112e", "title" : "Laparoscopic excision of the cystic stump", "authors" : [ "J Leroy" ], "date_published" : "2004-09-27", "abstract" : "", "tags" : [ "" ], "spec" : 2, "private" : true, "online" : false}
{ "_id" : "fmjtk5WAEKitMxyGj", "id" : "vd01en1114e", "title" : "Laparoscopic gastric banding in a patient with a BMI of 40", "authors" : [ "JM Zimmermann", " D Fölscher" ], "date_published" : "2004-09-27", "abstract" : "", "tags" : [ "" ], "spec" : 2, "private" : true, "online" : false}

我已经被这个问题困扰了几个小时,我不想在 SO 上发布这个,因为我相信这是一个简单的问题。然而,这令人难以置信。

4

2 回答 2

1

这里的问题是发布/订阅问题。您没有提到它,您如何处理出版物和订阅,但这很可能是问题所在。正在发生的事情是,当您浏览您的视频收藏时,此处已准备好订阅(因为您拥有其中的任何数据):Videos.find({ online: false})这不一定意味着(在那一刻)订阅处理Spec收藏也已准备好。因此,即使在服务器上查询正在运行,在客户端上它也是空的,因为数据尚未在客户端和服务器之间同步。所以你必须等到两个订阅都以某种方式准备好。您可以使用模板订阅,或waitOn在您的路由器中运行。

于 2016-01-05T13:44:28.693 回答
0

首先在服务器端检查您的发布和订阅是否已准备好并返回数据,检查如下

 Meteor.publish('Videso', function () {

  var result= Videso.find({});
  console.log(result);
   return result
   });

如果console.log在服务器端返回你的记录我有一个解决方案那么你的问题

你的问题的解决方案是

   Template.List.helpers({
   videos: function(){

    var vids = Videos.find({ online: false}).map(function (value) {
             console.log("id: " + value.spec);
             var idValue  = Specs.findOne({ "id": value.spec })
             console.log("idValue===",idValue)
             return _.extend(value, idValue);
       });
           console.log(vids);      //here merged data of both table having 
                                  // relvent record will returned
           return vids;



       }


  });

只需实施它并检查您的模板上的数据,它就会为您准备好然后投票给我:)

于 2016-01-06T05:26:21.050 回答