2

我在模板中有一种情况,我想在每个块内对父上下文中的值使用 if 块。

来自 Ember.js 视图层指南 ( http://emberjs.com/guides/view_layer/ ):

Ember 中的车把助手也可以指定变量。例如,{{#with controller.person as tom}} 表单指定后代范围可以访问的 tom 变量。即使子上下文具有 tom 属性,tom 变量也会取代它。

这种形式有一个主要好处:它允许您缩短长路径而不会失去对父范围的访问。

这在 {{#each}} 助手中尤为重要,它提供了一个 {{#each person in people}} 表单。在这种形式中,后代上下文可以访问 person 变量,但仍与模板调用 each 的范围相同。

我还启用了标志ENV.CP_DEFAULT_CACHEABLEENV.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/

我很确定这与此有关,因为当我禁用它时,我可以通过引用asENV.VIEW_PRESERVES_CONTEXT来使其工作。barparentView.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.fooand访问 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 回答