如果对象或字段存在,流星 {{#if}} 助手

Meteor {{#if}} helper if object or field exists

我正在使用 Blaze 空格键循环浏览模板中的文档以创建列表

<template name="objectTemplate">
   {{#if checkIfObjectExists}}
   ({{document.[0].object.object1}})
   {{/if}}
</template>

我知道在某些文档中,某些对象不存在于该对象位置。通常如果我没有 (),它会是空白的,我可以继续,但在这种情况下,当它为空时,我会有很多 (),这是不好的。

我创建了一个助手,但它不起作用。我已经尝试过 null、0、typeOf 等,但仍然无法正确处理。好歹帮手来了

Template.objectTemplate.helper ({ 
checkIfObjectExists: function() { 
 if (this !== 'null') {
  return true;
  } else {
    return false;
  }
}
});`

您的 if 不在正确的位置。您的 objectTemplate 可能是这样称呼的:

{{#each datum in data}}
    {{>objectTemplate data=data}}
{{/each}}

所以它总是被渲染。即使数据为空。 this 你检查你的助手将永远是真实的,它是模板本身。

所以,你应该这样称呼它:

{{#each datum in data}}
    {{#if datum.thingToTest}}
        {{>objectTemplate datum=datum}}
    {{/if}}
{{/each}}

不会调用整个子模板。

您可以使用 _.has(object, key) if you want to check if the object document.[0].object has the property object1 set. The function _.isObject(value) 将检查 document.[0].object.object1 是否为 Object(这也包括数组)。

因此,根据您的要求,您的模板助手应如下所示:

Template.objectTemplate.helper({
    checkIfObjectPropertyExists: function() {
        return _.has(this.document[0].object, "object1");
    },
    checkIfPropertyIsObject: function() {
        return _.isObject(this.document.[0].object.object1);
    }
});

您还可以注册一个 Underscore.js 全局模板助手,然后直接在您的 Meteor 模板中使用它:

Template.registerHelper('_', function () {
    return _;
}); 

<template name="objectTemplate">
   {{#if _.has this.document.[0].object 'object1'}}
      ({{document.[0].object.object1}})
   {{/if}}
</template>