在Ember.js中,启用ENV.view\u PRESERVES\u context时,视图的上下文是什么?

在Ember.js中,启用ENV.view\u PRESERVES\u context时,视图的上下文是什么?,ember.js,Ember.js,在模板中有一种情况,我希望在父上下文中的值上使用if块,而在每个块中使用if块 从Ember.js视图层指南: Ember中的把手帮助器也可以指定变量。例如,{{with controller.person as tom}}表单指定子作用域可以访问的tom变量。即使子上下文具有tom属性,tom变量也将取代它 此表单有一个主要优点:它允许您缩短长路径,而不会丢失对父作用域的访问 它在{{each}}helper中尤其重要,它提供了{{{each person in people}形式。在这种形式

在模板中有一种情况,我希望在父上下文中的值上使用if块,而在每个块中使用if块

从Ember.js视图层指南:

Ember中的把手帮助器也可以指定变量。例如,{{with controller.person as tom}}表单指定子作用域可以访问的tom变量。即使子上下文具有tom属性,tom变量也将取代它

此表单有一个主要优点:它允许您缩短长路径,而不会丢失对父作用域的访问

它在{{each}}helper中尤其重要,它提供了{{{each person in people}形式。在这种形式中,子代上下文可以访问person变量,但与模板调用每个变量的范围相同

我还启用了标志ENV.CP\u DEFAULT\u CACHEABLE和ENV.VIEW\u PRESERVES\u 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没有定义?根视图的上下文是什么

演示:

我很确定这与ENV.VIEW\u相关,因为当我禁用它时,我可以通过将bar引用为parentView.bar使其工作


禁用了ENV.VIEW_保存_上下文的工作演示:

当您有一个带有匿名模板的视图时,可以使用转到父视图的任何{property}调用。换句话说,{{view}}将不再更改视图的上下文。它的上下文将是父对象的上下文

请参见此处的tldr示例:

因此,为了让代码正常工作,我们必须使用view.foo和view.bar访问foo和bar,因为我们希望在{{view App.view}的上下文中获取这些属性

下面是对您的代码的更新:


PS:看起来{{log view.foo}}不起作用。您可能应该在github上提交一个bug报告。

现在在Ember中,当您有一个带有匿名模板的视图时,{property}调用转到父视图。换句话说,{{view}}将不再更改视图的上下文。它的上下文将是父对象的上下文

请参见此处的tldr示例:

因此,为了让代码正常工作,我们必须使用view.foo和view.bar访问foo和bar,因为我们希望在{{view App.view}的上下文中获取这些属性

下面是对您的代码的更新:


PS:看起来{{log view.foo}}不起作用。您可能应该在github上提交一份bug报告。

谢谢您的帮助。那个伐木工人对我撒谎没用。我为此提交了一份bug报告。我假设具有命名模板的视图可以在没有视图的情况下直接引用其属性。?正确。使用{{view}}会改变上下文,但是{{view}不会。谢谢你提出这个问题-我提出了一个修复{{log}的请求-谢谢你的帮助。那个伐木工人对我撒谎没用。我为此提交了一份bug报告。我假设具有命名模板的视图可以在没有视图的情况下直接引用其属性。?正确。使用{{view}}会改变上下文,但{{view}不会。感谢您提出这个问题-我提出了一个拉取请求来修复{{log}-
<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>​