19

我正在尝试做我认为应该是一项非常简单的任务,但在过去的一个小时里一直没有这样做。如果用户属性与值匹配,我想默认选择一个选择选项。

<select name="myName">
  {{#each addKeys myTable}} <!-- addKeys creates variables for keys and values -->
    <option value="{{key}}" {{#if currentUser.property === key}}selected="selected"{{/if}}>{{value}}</option>
  {{/each}}
</select>

现在我认为这很简单,可以实施。但事实证明,空格键不允许除否定感叹号以外的条件运算符,所以等号是毫无疑问的。然后我为了尝试而尝试了一些可怕的东西:

在模板中myTemplate

<select name="myName">
  {{#each addKeys myTable}}
    <option value="{{key}}" {{isSelected currentUser.property key}}>{{value}}</option>
  {{/each}}
</select>

mytemplate.js

Template.myTemplate.helpers({
  isSelected: function(v1, v2) {
    if (v1 === v2)
      return "selected=\"selected\"";
    return '';
  }
});

这段代码不仅很糟糕,看起来很糟糕,而且它不起作用:

Exception in Meteor UI: String contains an invalid character

我不明白为什么这么简单的事情似乎不可能实现。我在那里错过了什么吗?

4

3 回答 3

32

以下是空格键中{{#if}}语句的概述

财产

当然,最简单的可能实现是当作用域对象具有评估为布尔值的属性时

例如,如果您有:

var item = {
  text: 'hello',
  checked: false
};

然后你可以像这样评估一个 if 块:

class="{{#if checked}}checked{{/if}}"

功能

我们也可以在这里评估一个函数。我们可以向助手添加一个函数,而不是向项目添加一个函数,它将继承传递给它的项目的数据上下文。因此,如果我们有以下助手:

Template.item.helpers({
    saysHi: function() {
      return this.text === "hi";
    }
});

然后我们可以运行以下代码:

<template name="item">
   {{text}}
   {{#if saysHi}} - Hi Back {{/if}}
</template>

注意:助手的实现可以访问当前的数据上下文this

带参数的函数

您还可以将任意数量的参数传递给辅助函数,如下所示:

模板:{{frob a b c verily=true}}
助手调用:frob(a, b, c, Spacebars.kw({verily: true}))

当应用于我们的 if 块时,我们可以执行以下操作:

{{#if equals owner currentUser._id}}
    <button class="delete">&times;</button>
{{/if}}

然后像这样添加equals到我们的模板助手中:

Template.item.helpers({
    equals: function(v1, v2) {
        return (v1 === v2);
    }
});

通用助手

由于这是一个在任何地方都可以使用的通用方法,我们应该将它添加到每个模板中,而不是重新创建它。

注意:要创建可在任何模板中使用的助手,请使用Template.registerHelper.

Template.registerHelper('equals',
    function(v1, v2) {
        return (v1 === v2);
    }
);

这是 MeteorPad 中的一个工作演示,其中包括在此处构建的每种 IF 类型之一

于 2015-02-25T04:02:45.430 回答
5

尝试这个:

在您的模板中:

<option value={{key}} selected={{isSelected currentUser.property key}}>

然后让你的助手返回一个布尔值。

更多关于这里的主题:https ://github.com/meteor/meteor/wiki/Using-Blaze#conditional-attributes-with-no-value-eg-checked-selected

于 2014-07-09T10:56:37.300 回答
1

尽管空格键不支持相等,但此方法可用于检查相等

你可以使用这样的东西

{{#if chkeq variable value}}

例子

{{#if chkeq applicationStatus "Draft"}}

至少它对我有用

其中 chkeq 是一个全局助手,类似于这样

chkeq:function(a,b){
    if(a==b){
      return true;}
else return false;
}
于 2018-01-10T08:44:03.793 回答