2012-05-22 19 views
2

我有一個模板中的情況,我想在每個塊內使用父上下文中的值時使用if塊。在Ember.js中,啓用ENV.VIEW_PRESERVES_CONTEXT時視圖的上下文是什麼?

從Ember.js視圖層引導(http://emberjs.com/guides/view_layer/):在灰燼

把手助手還可以指定變量。例如,{{#with controller.person as tom}}表單指定了後代作用域可以訪問的tom變量。即使子上下文有tom屬性,tom變量也會取代它。

此表單有一個主要優點:它允許您縮短長路徑而不會失去對父範圍的訪問權限。

這對於{{#each}}助手來說非常重要,它提供了一個{{#每個人都有的人}}形式。在這種形式下,後代上下文可以訪問person變量,但保持在與模板調用每個變量的範圍相同的範圍內。

我還啓用了標誌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/

我敢肯定,因爲當我關閉,我可以把它參照barparentView.bar工作,這關係到ENV.VIEW_PRESERVES_CONTEXT

工作演示,其中ENV.VIEW_PRESERVES_CONTEXT被禁用:http://jsfiddle.net/hekevintran/sMeyC/11/

回答

4

現在灰燼,當你有一個匿名的模板視圖中的任意{{property}}來電與去到父視圖。換句話說,{{#view}}將不再改變視圖的上下文。它的背景將是父母的背景。

見看過來tldr例子:https://gist.github.com/2494968

爲了得到你的代碼的工作,我們將不得不使用 view.fooview.bar訪問foo和酒吧,因爲我們想在 {{#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上提交bug報告。

+0

感謝您的幫助。對我說謊的記錄員沒有幫助。我爲此提交了一份錯誤報告。我認爲具有命名模板的視圖可以直接引用它們的屬性而不用'view.'? – hekevintran

+0

正確。使用{{view}}會改變上下文,但{{#view}}不會。 – Ryan

+1

感謝您提出這個問題 - 我提出了一個修正{{log}}的pull請求 - https://github.com/emberjs/ember.js/pull/863 –