web-dev-qa-db-ja.com

スペースバーの同等性を確認しますか?

非常に簡単な作業だと思うことをやろうとしていますが、この1時間はうまくいきませんでした。ユーザープロパティが値と一致する場合、デフォルトで選択オプションを選択したいと思います。

<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

なぜこんなに単純なことを成し遂げることが不可能に思えるのか理解できません。私はそこに何かが欠けていますか?

19
SylvainB

これを試して:

テンプレート内:

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

次に、ヘルパーにブール値を返してもらいます。

ここでのトピックの詳細: https://github.com/meteor/meteor/wiki/Using-Blaze#conditional-attributes-with-no-value-eg-checked-selected

スペースバーの_{{#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);
    }
);
_

ここに構築されたIFの各タイプの1つを含むMeteorPadの動作デモがあります

32
KyleMit

スペースバーは同等性をサポートしていませんが、この方法は同等性をチェックするために機能します

あなたはこのようなものを使うことができます

{{#if chkeq variable value}}

{{#if chkeq applicationStatus "Draft"}}

少なくともそれは私のために働いた

ここで、chkeqはグローバルヘルパーであり、次のようになります。

chkeq:function(a,b){
    if(a==b){
      return true;}
else return false;
}
1