是否可以在 Meteor 中批量定义多个模板助手,而不是逐一定义?

问题描述 投票:0回答:2

名称为

Services
的集合有多个文档:

{
    serviceTitle: "Unlimited HDR Photography",
    serviceDescription: "Includes unlimited daytime HDR photos and a single trip out to the property. A zip file with the bare JPG files will be emailed to you. No website or virtual tour / panoramas.",
    serviceHTML: "",
    sku: "hdrPhotos",
    price: 100,
    _id: "x5Hq7ybdS3YHmrgsa"
}

{
    serviceTitle: "Twilight Photography",
    serviceDescription: "Photos will be shot 15 minutes prior to sunset for dramatic lighting effects.",
    serviceHTML: "",
    sku: "twilightPhotos",
    price: 100,
    _id: "RLhjHBGicGQKgS4SQ"
}

{
    serviceTitle: "Video Clips",
    serviceDescription: "We will come in with professional video equipment and shoot numerous video clips of the property. The video files will then be uploaded to your Single Property Website provider.",
    serviceHTML: "",
    sku: "videoClips",
    price: 175,
    _id: "uBZSeNWa4zZNMa8z9"
}

假设我想要可以显示每个不同服务的服务描述和价格的助手。

Template.myTemplate.helpers({

  hdrPhotosServiceDescription: function(){ 
    return Services.findOne({"sku": "hdrPhotos"}, { serviceDescription:1, _id:0}).serviceDescription
  },
  hdrPhotosPrice: function(){ 
    return Services.findOne({"sku": "hdrPhotos"}, { price:1, _id:0}).price
  },

  twilightPhotosServiceDescription: function(){ 
    return Services.findOne({"sku": "twilightPhotos"}, { serviceDescription:1, _id:0}).serviceDescription
  },
  twilightPhotosPrice: function(){ 
    return Services.findOne({"sku": "twilightPhotos"}, { price:1, _id:0}).price
  },

  videoClipsServiceDescription: function(){ 
    return Services.findOne({"sku": "videoClips"}, { serviceDescription:1, _id:0}).serviceDescription
  },
  videoClipsPrice: function(){ 
    return Services.findOne({"sku": "videoClips"}, { price:1, _id:0}).price
  }

});

此示例仅显示了三种不同的服务,并且希望为每个服务的两个属性提供助手。

{{hdrPhotosServiceDescription}}, {{hdrPhotosPrice}}, {{twilightPhotosServiceDescription}}, {{twilightPhotosPrice}}, {{videoClipsServiceDescription}}, {{videoClipsPrice}}

如果每个服务有 10 个不同的属性,而我需要每个属性的助手,并且我有 30 个不同的服务,该怎么办?这样做需要我编码并定义 300 个不同的助手。

有更简单的方法吗?此外,根据我网站的结构方式,我无法使用

#each
作为 Meteor 手册用于其
Posts
集合的方式。

javascript meteor spacebars meteor-helper meteor-collections
2个回答
2
投票

模板助手可以有参数。最简单的方法是:

Template.myTemplate.helpers({
  getField: function(sku, fieldName) {
    var projection = {_id: 0};
    projection[fieldName] = 1;
    return Services.findOne({"sku": sku}, projection)[fieldName];
  }
}

你可以这样称呼那个助手:

{{getField "hdrPhotos" "serviceDescription"}}


0
投票

我还找到了另一种方法:

(这是用于注册全局助手,但相同的代码体可用于模板助手)

Handlebars.registerHelper("hdrPhotos", function() {
  return Services.findOne({"sku": "hdrPhotos"});
});

Handlebars.registerHelper("twilightPhotos", function() {
  return Services.findOne({"sku": "twilightPhotos"});
});

Handlebars.registerHelper("videoClips", function() {
  return Services.findOne({"sku": "videoClips"});
});

这个想法是,每个帮助器都会根据 sku 返回服务的整个文档。

然后,可以简单地使用 ( . ) 来调用各个属性

{{hdrPhotos.price}}
返回 100

{{hdrPhotos.serviceTitle}}
返回“无限HDR摄影”

等等等等

© www.soinside.com 2019 - 2024. All rights reserved.