2012-05-29 4 views
2

나는 두 개의 서로 다른보기 모델이있는 페이지가 있습니다어떻게 데이터를 하위 모델에 바인딩합니까?

<?page title="My page" contentType="text/html;charset=UTF-8"?> 
<div apply="org.zkoss.bind.BindComposer" 
viewModel="@id('vm') @init('com.mycompany.FirstViewModel')"> 
<!-- A lot of unimportant stuff --> 
<tabbox> 
    <tabs> 
     <tab label="Tab1" ></tab> 
        <!-- Other unimportant tabs --> 
    </tabs> 
    <tabpanels> 
     <tabpanel> 
     <include src="inc/other.zul" p="@ref(vm.selected)" pid="@ref(vm.selected.id)" ></include> 
     </tabpanel> 
    </tabpanels> 
</tabbox> 
</div> 

을 그리고 포함하는 것입니다 :

<window> 
    <label id="sid" value="@load(pid)" /> 
    <div apply="org.zkoss.bind.BindComposer" 
     viewModel="@id('vms') @init('com.mycompany.SecondViewModel')"> 
     <listbox model="@id('vars') @load(p.someList)" 
      selectedItem="@bind(vms.selected)" 
      emptyMessage="No data in list"> 
        <!-- Template and stuff --> 
     </listbox> 
     <label id="sid1" value="@load(pid)" /> 
    </div> 
</window> 

문제는 내가 두 번째 뷰 모델을 정의하면, 모든 외부 참조가 액세스 할 수없는 것입니다 : I 첫 번째 레이블에 대한 값을 가지고 있지만 목록 상자 나 두 번째 레이블에 대한 값이 없습니다. 그렇게 할 수있는 방법이 있습니까?

<div apply="org.zkoss.bind.BindComposer" 
viewModel="@id('vms') @init('com.mycompany.SecondViewModel')" list="@ref(p.someList)"> 
<listbox model="@id('vars') @load(list)" 
    selectedItem="@bind(vms.selected)" 
    emptyMessage="No data in list"> 

내가 처음에 두 번째보기 모델을 병합 할 수 있지만, 매우 편리하지 않을 것이다 : 나는 이렇게 성공하지 시도! 나는 모듈 방식으로 접근 할 수있는 다른 솔루션에 대해서도 열려있다.

ZK의 나의 버전은 6.0.1

+0

http://books.zkoss.org/wiki/ZK_Component_Reference/Essential_Components/Include#Pass_Values_to_the_Included_Page_2 매개 변수 전달은 매우 정적이며 단순히 외부 페이지의 렌더링 단계에 대해 requestScope에 넣습니다. 사용자가 나중에 탭 패널을 클릭하면 원래 렌더링에서 사용 된 매개 변수가 다시 평가되지 않습니다. 내부 항목을 빈 viewmodel에 바인드합니다. 내부 및 외부보기 모델이 수신 할 수있는 tabbox select에 전역 명령을 입력하고 desktopScope를 통해 선택한 날짜를 내부보기 모델에 전달할 수 있습니까? – simbo1905

+0

이것은 MVC를 말하며 MVVM을 사용합니다. 또한 Include 내부에서 매개 변수에 액세스 할 수 있으므로 더 이상 액세스 할 수없는 하위 뷰 모델입니다. – Kjir

+0

포함 내용은 mvc, mvp 또는 mvvm과 별개입니다. 요점은 이벤트가 시작될 때 다시 평가되지 않는다는 것입니다. – simbo1905

답변

0

그것은이다가 (WAS) 향후 버전에서 수정 된 ZK에서 실제로 bug.

0

는 외부 구성 요소에 액세스 할 수없는 이유는 당신의 작곡가 즉 BindComposer 당신이 메인 ZUL뿐만 아니라 포함 ZUL에 대해 같은 작곡가가이입니다. 외부 ZUL에서 포함 된 목록 상자에 액세스해야합니다. 그래서 ZUL 포함의 작곡가를 제거, 공용로 BindComposer 선언 변수에 액세스하는 동안이 개 공간의 소유자

<?page title="My page" contentType="text/html;charset=UTF-8"?> 
<div apply="org.zkoss.bind.BindComposer" 
viewModel="@id('vm') @init('com.mycompany.FirstViewModel')"> 
<!-- A lot of unimportant stuff --> 
<tabbox> 
    <tabs> 
     <tab label="Tab1" ></tab> 
        <!-- Other unimportant tabs --> 
    </tabs> 
    <tabpanels> 
     <tabpanel> 
     <include id="include" src="inc/other.zul" p="@ref(vm.selected)" pid="@ref(vm.selected.id)" ></include> 
     </tabpanel> 
    </tabpanels> 
</tabbox> 
</div> 


<window id="win"> 
    <label id="sid" value="@load(pid)" /> 
    <div 
     viewModel="@id('vms') @init('com.mycompany.SecondViewModel')"> 
     <listbox id="listbox2" model="@id('vars') @load(p.someList)" 
      selectedItem="@bind(vms.selected)" 
      emptyMessage="No data in list"> 
        <!-- Template and stuff --> 
     </listbox> 
     <label id="sid1" value="@load(pid)" /> 
    </div> 
</window> 

이제 내부 목록 상자에 액세스가 창에 ID를 제공 :에

Listbox include$win$listbox2; 

당신의 doAfterCompose()이 줄을 추가하십시오.

Sysout("You can access your inner Listbox and it is:"+include$win$listbox2); 

이제 Listbox가 NULL이되지 않습니다.

링크 : http://books.zkoss.org/wiki/ZK_Developer's_Reference/UI_Composing/ID_Space

+0

포함 된 파일에서 Composer를 제거하면 vms가 null로 정의되므로 목록에서 항목을 클릭 할 때마다 예외가 발생합니다. 그래서 기본적으로 나는 두 번째 ViewModel을 가지고 있지 않다 ... – Kjir

+0

@Kjir 나는 나의 도움이 희망을 편집했다 ~ –

+0

내가 틀렸다고 정정하면 :'apply = "org.zkoss.bind.BindComposer" '를 추가하고'id = "win"'; 나는 그것을 시도하고, VM은 ViewModel을 포함하지 않습니다 ... 또한 doAfterCompose()이 없어, MVVM이 아닌 MVC입니다 ... – Kjir

관련 문제