В Эмбере.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 ответ:
Теперь в Ember, когда у вас есть представление с анонимным шаблоном, любые
{{property}}
вызовы идут в родительское представление. Другими словами,{{#view}}
больше не будет изменять контекст представления. Это будет контекст родителя.Смотрите примеры tldr здесь: https://gist.github.com/2494968
Поэтому для того, чтобы заставить ваш код работать, нам придется обращаться к foo и bar с помощью
view.foo
иview.bar
, поскольку мы хотим получить эти свойства в контексте{{#view App.view}}
.Вот обновленная скрипка с вашим кодом: http://jsfiddle.net/cRgag/
PS: похоже, что<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>
{{log view.foo}}
не работает. Вам, вероятно, следует отправить отчет об ошибке на github.