Проверить равенство в пробелах?
Я пытаюсь сделать то, что, по моему мнению, должно быть очень простой задачей, но не смог этого сделать за последний час. Я хочу выбрать опцию выбора по умолчанию, если свойство пользователя соответствует значению.
<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>
Теперь я подумал, что это достаточно просто для реализации. Но оказывается, что Spacebars не допускают условных операторов, отличных от восклицательного знака отрицания, поэтому равные знаки не могут быть и речи. Затем я попытался сделать что-то ужасное ради попытки:
В шаблоне 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
Я не понимаю, почему что-то такое простое кажется невозможным. Я что-то не хватает?
Ответы
Ответ 1
Попробуйте следующее:
В вашем шаблоне:
<option value={{key}} selected={{isSelected currentUser.property key}}>
Затем ваш помощник возвращает логическое значение.
Подробнее о теме: https://github.com/meteor/meteor/wiki/Using-Blaze#conditional-attributes-with-no-value-eg-checked-selected
Ответ 2
Вот обзор операторов {{#if}}
в Spacebars
Свойство
Конечно, простейшая возможная реализация заключается в том, что объект с областью действия имеет свойство, которое вычисляет логическое значение
Например, если у вас есть:
var item = {
text: 'hello',
checked: false
};
Затем вы можете оценить блок if следующим образом:
class="{{#if checked}}checked{{/if}}"
Функция
Мы также могли бы оценить функцию здесь. Вместо добавления функции к элементу мы можем добавить функцию к помощнику и наследуем datacontext передаваемого элемента. Итак, если бы у нас был следующий помощник:
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">×</button>
{{/if}}
Затем добавьте equals
к нашему помощнику шаблонов следующим образом:
Template.item.helpers({
equals: function(v1, v2) {
return (v1 === v2);
}
});
Универсальные помощники
Поскольку это общий метод, который может быть полезен где угодно, мы должны добавить его к каждому шаблону, а не воссоздать его.
Примечание: Чтобы создать помощник, который можно использовать в любом шаблоне, используйте Template.registerHelper
.
Template.registerHelper('equals',
function(v1, v2) {
return (v1 === v2);
}
);
Ответ 3
Хотя пробелы не поддерживают равенство, этот метод работает для проверки равенства
вы можете использовать что-то вроде этого
{{#if chkeq variable value}}
Пример
{{#if chkeq applicationStatus "Draft"}}
по крайней мере, это сработало для меня