2012-05-22 2 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} 사람}} 양식을 제공하는 {{#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 "undefined"가 인쇄됩니다. foo가 정의되지 않은 이유는 무엇입니까? 루트보기의 컨텍스트는 무엇입니까?

데모 : http://jsfiddle.net/hekevintran/sMeyC/10/

나는 내가 그것을 parentView.bar으로 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 App.view}}의 맥락에서 이러한 속성을 가져 오기 위해 원하기 때문에 우리가 view.fooview.bar를 사용하여 foo는 바에 액세스해야합니다 작업 코드를 얻기 위해 . 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에 버그 보고서를 제출해야합니다.

+0

도움 주셔서 감사합니다. 나에게 거짓말하는 로거는 도움이되지 못했다. 나는 그것에 대한 버그 보고서를 제출했다. 나는 템플릿이라는 이름의 뷰가 'view'없이 그들의 속성을 명백히 참조 할 수 있다고 가정한다. – hekevintran

+0

이 맞습니다. {{view}}를 사용하면 컨텍스트가 변경되지만 {{#view}}는 변경되지 않습니다. – Ryan

+1

이것을 가져 주셔서 감사합니다. {{log}} - https://github.com/emberjs/ember.js/pull/863을 수정하라는 요청을 함께 처리합니다. –

관련 문제