В Эмбере.js, каков контекст представления, когда ENV.Вид сохраняет контекст включен?


У меня есть ситуация в шаблоне, где я хочу использовать блок if для значения в Родительском контексте, находясь внутри каждого блока.

Из уголька.JS View Layer guide (http://emberjs.com/guides/view_layer/):

Помощники руля в Ember также могут указывать переменные. Например, {{#с контроллером.person as tom}} форма задает переменную tom, доступ к которой могут получить области потомков. Даже если дочерний контекст имеет свойство tom, переменная tom будет замените его.

У этой формы есть одно важное преимущество:она позволяет сократить длинные пути без потери доступа к родительской области.

Это особенно важно в помощнике {{#each}}, который предоставляет форму {{#each person in people}}. В этой форме контекст потомка имеет доступ к переменной person, но остается в той же области, где шаблон вызвал каждый.

Я также включил флаги 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>

Это не работает. Я не знаю почему. Logging foo выведет "undefined". Почему foo не определено? Каков контекст корневого представления?

Демо: http://jsfiddle.net/hekevintran/sMeyC/10/

Я почти уверен, что это связано с ENV.VIEW_PRESERVES_CONTEXT, потому что когда я отключаю это, я могу заставить его работать, ссылаясь на bar Как parentView.bar.

Рабочая демонстрация, где ENV.VIEW_PRESERVES_CONTEXT отключена: http://jsfiddle.net/hekevintran/sMeyC/11/

1 2

1 ответ:

Теперь в Ember, когда у вас есть представление с анонимным шаблоном, любые {{property}} вызовы идут в родительское представление. Другими словами, {{#view}} больше не будет изменять контекст представления. Это будет контекст родителя.

Смотрите примеры tldr здесь: https://gist.github.com/2494968

Поэтому для того, чтобы заставить ваш код работать, нам придется обращаться к foo и bar с помощью view.foo и 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.