テンプレートで、各ブロック内で親コンテキストの値に対して 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
これを無効にすると、bar
asを参照して機能させることができるため、これが関連していると確信していparentView.bar
ます。
ENV.VIEW_PRESERVES_CONTEXT
無効になっている作業デモ: http://jsfiddle.net/hekevintran/sMeyC/11/