19

テンプレートで libraryPrep オブジェクトのモーダル ビューを次のように表示します。

if (_.isUndefined(this.libraryPreps)) {
                this.$el.html(this.template({  }));
            } else {
                this.$el.html(this.template({ libraryPreps: this.libraryPreps.toJSON() }));
            }

libraryPreps オブジェクトがある場合は、else ステートメントが機能します。私のテンプレートでは、次のように使用します。

<select id="libraryPreps" >
                    <%  if (!_.isUndefined(libraryPreps)) { %>
                    <% _.each(libraryPreps, function (libraryPrep) { %>
                    <option value="<%=libraryPrep.id%>"><%= libraryPrep.name %></option>
                    <% }); %>
                    <% } %>
                </select>

libraryPreps オブジェクトがない場合、テンプレートをレンダリングできず、コンソールに libraryPreps が定義されていないというエラーが表示されます。テンプレートで undefined を間違ってチェックしていませんか? バックボーンのモーダルビューでも同じようにチェックしているような気がするのですが、なぜか実際のテンプレートではうまくいかないようです。テンプレート表記は正しいですか? ありがとう。

4

3 に答える 3

31

変数を関数に渡す場合、その変数は評価され、そのような変数がないためエラーがスローされます。対照的に、バックボーン ビューでは、常に機能するオブジェクトのプロパティundefinedにアクセスしています (その名前のプロパティが存在しない場合は値を返します)。

代わりに、typeof宣言されていない変数に対しても機能する演算子を使用する必要があります(variable === undefined と typeof variable === "undefined"を見て、JavaScript 変数が存在するかどうかを確認します(定義済み/初期化済み) ) ):

<select id="libraryPreps"><%
    if (typeof libraryPreps !== "undefined") {
        _.each(libraryPreps, function (libraryPrep) { %>
            <option value="<%=libraryPrep.id%>"><%= libraryPrep.name %></option><%
        });
    }
%></select>

テンプレートで使用する_.isUndefinedには、値をテンプレートで明示的に使用できるようにする必要があります。ドキュメントから:

デフォルトでは、ステートメントtemplateを介してデータの値をローカル スコープに配置します。withただし、variable設定で単一の変数名を指定できます。これにより、テンプレートのレンダリング速度が大幅に向上します。

_.template("Using 'with': <%= data.answer %>", {answer: 'no'}, {variable: 'data'});
=> "Using 'with': no"

これで、次のようなテンプレートを作成できます。

 <% if (!_.isUndefined(data.libraryPreps)) { %> …
 <% if ("libraryPreps" in data) { %> …
于 2013-06-07T06:06:54.130 に答える
0

同様の問題がありましたが、次の解決策を見つけました。

それ以外の:if (typeof libraryPreps !== "undefined") {

使用する:if (!_.isUndefined(obj.libraryPreps)) {

于 2016-08-11T09:21:59.020 に答える