ericf / express-handlebars

A Handlebars view engine for Express which doesn't suck.
BSD 3-Clause "New" or "Revised" License
2.31k stars 384 forks source link

Adding helper to check object property value #37

Closed tommedema closed 11 years ago

tommedema commented 11 years ago

I have an array that looks like this:

var menu =
[
  {
    type: "category",
    labels: [
      {lang: "en", text: "appetizer"},
      {lang: "nl", text: "voorgerecht"}
    ],
    descriptions: [
      {lang: "en", text: "great snacks before the main dish"},
      {lang: "nl", text: "lekkere snacks voor het hoofdgerecht"}
    ],
    visible: true,
    items: [
      {
        type: "item",
        labels: [
          {lang: "en", text: "French bread"},
          {lang: "nl", text: "stokbrood"}
        ],
        descriptions: [
          {lang: "en", text: "french bread with garlic butter"},
          {lang: "nl", text: "stokbrood bereid met knoflook"}
        ],
        visible: true,
        price: {
          currency: "EUR",
          value: 1.5
        }
      },
      {
        type: "category",
        labels: [
          {lang: "en", text: "antipasta"},
          {lang: "nl", text: "antipasta"}
        ],
        descriptions: [
          {lang: "en", text: "apptizer but only pasta"},
          {lang: "nl", text: "pasta als voorgerecht"}
        ],
        visible: true,
        items: [
          {
            type: "item",
            labels: [
              {lang: "en", text: "paesana alla gorgonzola"},
              {lang: "nl", text: "paesana met gorgonzola kaas"}
            ],
            descriptions: [
              {lang: "en", text: "great pizza with lots of cheese"},
              {lang: "nl", text: "lekkere pizza met veel kaas"}
            ],
            visible: true,
            price: {
              currency: "EUR",
              value: 1.5
            }
          }
        ]
      }
    ]
  },
  {
    type: "item",
    labels: [
      {lang: "en", text: "paesana alla gorgonzola"},
      {lang: "nl", text: "paesana met gorgonzola kaas"}
    ],
    descriptions: [
      {lang: "en", text: "great pizza with lots of cheese"},
      {lang: "nl", text: "lekkere pizza met veel kaas"}
    ],
    visible: true,
    price: {
      currency: "EUR",
      value: 1.5
    }
  }
];

I pass this menu array to the view like so:

res.render("manage/menu", {
    menu: menu
});

Now I would like to render this menu on the server side in my views using handlebars. I need to differentiate between each array element: it can be either a category (element.type === "category") or a normal item (element.type === "item"). Something like this:

{{#each menu}}

{{#if elementIsCategory this}}

  category

{{else}}

  item

{{/if}}

  {{/each}}

And this helper:

res.render("manage/menu", {
  menu: menu,
  helpers: {
    elementIsCategory: function(element) {
      console.log(this);
      console.log(this.get("type"));
      console.log(this.get("resto"));
      return element.type === "category";
    }
  }
});

I don't even see the console.log lines. How should this be done instead?

ericf commented 11 years ago

This is a design decision made by Handlebars to not allow calling helpers inside of the opening {{#if}} tags.