2

テンプレートで、各ブロック内で親コンテキストの値に対して if ブロックを使用したい状況があります。

Ember.js ビュー レイヤー ガイド ( http://emberjs.com/guides/view_layer/ ) から:

Ember のハンドルバー ヘルパーは、変数を指定することもできます。たとえば、{{#with controller.person as tom}} フォームは、子孫スコープがアクセスできる tom 変数を指定します。子コンテキストに tom プロパティがある場合でも、tom 変数がそれを置き換えます。

このフォームには大きな利点が 1 つあります。それは、親スコープへのアクセスを失わずに長いパスを短縮できることです。

これは、{{#each person in people}} フォームを提供する {{#each}} ヘルパーで特に重要です。この形式では、子孫コンテキストは person 変数にアクセスできますが、テンプレートが each を呼び出した場所と同じスコープにとどまります。

フラグENV.CP_DEFAULT_CACHEABLEとも有効にしましたENV.VIEW_PRESERVES_CONTEXT

コード:

App = Ember.Application.create({});

App.view = Ember.View.extend({
    foo: [1, 2, 3],
    bar: true
});

テンプレート:

<script type="text/x-handlebars" >
    {{#view App.view}}
        {{log foo}} {{! this will log "undefined"}}
        {{#each array in foo}}
            {{#each number in array}}
                {{#if bar}}
                    {{number}}
                {{/if}}
            {{/each}}
        {{/each}}
    {{/view}}
</script>

これは動作しません。理由はわかりません。ロギングfooは「未定義」を出力します。なぜfoo未定義なのですか?ルート ビューのコンテキストは何ですか?

デモ: http://jsfiddle.net/hekevintran/sMeyC/10/

ENV.VIEW_PRESERVES_CONTEXTこれを無効にすると、barasを参照して機能させることができるため、これが関連していると確信していparentView.barます。

ENV.VIEW_PRESERVES_CONTEXT無効になっている作業デモ: http://jsfiddle.net/hekevintran/sMeyC/11/

4

1 に答える 1

4

Emberでは、匿名テンプレートを使用したビューがある場合、{{property}}呼び出しはすべて親ビューに移動します。つまり、{{#view}}ビューのコンテキストは変更されなくなります。コンテキストは親のコンテキストになります。

ここでtldrの例を参照してください:https ://gist.github.com/2494968

view.fooしたがって、コードを機能させるには、を使用してfooとbarにアクセスする必要があります。view.barこれは、のコンテキストでこれらのプロパティをフェッチするため{{#view App.view}}です。

これがあなたのコードで更新されたフィドルです:http://jsfiddle.net/cRgag/

<script type="text/x-handlebars" >
    {{#view App.view}}
        {{log view.foo}} {{! this will log "undefined"}}
        {{#each view.foo}}
            {{#each this}}
                {{#if view.bar}}
                    {{this}}
                {{/if}}
            {{/each}}           
        {{/each}}
    {{/view}}
</script>​

PS:{{log view.foo}}動作しないようです。おそらくgithubにバグレポートを提出する必要があります。

于 2012-05-22T23:15:08.973 に答える