2017-05-23 1 views
0

MVJ 패턴을 사용하여 ExtJs에 익숙해졌으며 MVVM 패턴을 구현하려고합니다. 내 견해에 상점을 묶을 수 없습니다.ViewModel에 상점을 바인딩하려고 시도합니다.

주 그리드가 있는데 선을 선택할 때 세부 그리드를 열려고합니다.

detailsView = mainPanel.add({ 
    xtype: 'rma-details', 
    viewModel: {data: {id: id}} 
}) 

Ext.define('Mb.view.rma.Details', { 
    extend: 'Ext.grid.Panel', 
    alias: 'widget.rma-details', 
    requires: [ 
     'Mb.view.rma.DetailsController', 
     'Mb.view.rma.DetailsModel' 
    ], 
    controller: 'rma-details', 
    viewModel: {type: 'rma-details'}, 
    bind: { 
     title: 'Retour n° {id}', 
     store: '{details}' 
    }, 
    (...) 
}); 

Ext.define('Mb.view.rma.DetailsModel', { 
    extend: 'Ext.app.ViewModel', 
    alias: 'viewmodel.rma-details', 
    requires: ['Mb.model.rma.Detail'], 
    data: { 
     id: 0 
    }, 
    stores:{ 
     details: { 
      model: 'rma.Detail', 
      filters: [{ 
       property: 'rma', 
       value: '{id}' 
      }] 
     } 
    } 
}); 

Ext.define('Mb.model.rma.Detail', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name: 'id', type: 'int'}, 
     {name: 'rma', type: 'int'}, 
     (...) 
    ], 
    proxy: { // cf. 2nd subsidiary question 
     (...) 
    } 
}); 

보기의 제목은 정확하게 id의 값으로 바운드됩니다.

그러나 상점

, 나는 오류를 얻을 : 모델 ( model: 'rma.Detail')에 대한 참조가 뷰 모델에서 인식되지 않는 이유

[E] Ext.data.schema.Schema.lookupEntity(): No such Entity "rma.Detail".
Uncaught Error: No such Entity "rma.Detail".

내가 이해가 안 돼요. 모델을 참조 할 필요가없는 MVC 패턴을 사용하여 항상 rma.Details과 유사한 참조를 사용하여 저장소를 참조했습니다.

주요 질문은 다음과 같습니다. ViewModel에서 모델 rma.Details을 어떻게 선언해야합니까?

자회사 질문은 다음과 같습니다

  1. 이보기에 값 id을 설정하려면이 올바른 방법입니다. ({xtype: 'rma-details', viewModel: {data: {id: id}}})?
  2. 저는 항상 저장소 클래스에 프록시를 정의하는 데 사용됩니다. 여기에는 ViewModel에 정의되어 있으므로 저장소 클래스가 없습니다. 위와 같이 모델 클래스에서 선언하는 것이 맞습니까?

답변

1

모델 선언에 schema을 정의한 다음 이에 대한 네임 스페이스를 정의해야합니다. 또는 기본 모델 (api 문서에서 스키마 요약을 확인하십시오)에서 더 나은 방법입니다.

When describing associations between entities, it is desirable to use shorthand names that do not contain the common namespace portion. This is called the entityName as opposed to its class name. By default, the entityName is the full class name. However, if a namespace is used, the common portion can be discarded and we can derive a shorter name.

당신은 여기에 약식 이름을 사용하려고했지만, 당신은 스키마 네임 스페이스를 정의하지 않았기 때문에,이 모델 클래스에 해결할 수 없습니다.

자회사 응답 :

  1. 예, 당신은이 작업을 수행 할 수 있습니다.
  2. 제 생각에는 여기에 옳고 그른 것은 없습니다. 뷰 모델에서 필터 옆에 프록시를 선언 할 수 있습니다. 저장소를 별도의 클래스로 선언 한 다음 뷰 모델에서 저장소를 사용할 수도 있습니다 (사용하는 방법). 여기에서는 일종의 viewmodel 데이터에 바인딩 된 구성 만 지정합니다.
+0

연결하려는 의사의 말 : * 기본적으로이 클래스의 단일 인스턴스가 만들어집니다 *. 그렇다면 스키마를 정의해야하는 이유는 무엇입니까? 모델에'schema : {namespace : 'Mb.model'}'을 추가하면 문제를 해결할 수 있습니까? –

+0

예, 문제가 해결됩니다. 기본 인스턴스에 네임 스페이스 구성이 지정되지 않았습니다. 스키마를 선언하지 않으려면 저장소 선언에서 모델의 전체 클래스 이름을 지정할 수 있습니다. – scebotari66

+0

내 ViewModel에서'모델 : 'rma.Detail''을'store :'rma.Details''로 바꿨으므로 더 이상 스키마 선언이 필요하지 않습니다. 하지만 이제는 또 다른 문제가 있습니다.'rma.Details' 저장소가'remoteFilter : true, autoLoad : true'로 구성되어 있어도로드되지 않습니다. –

관련 문제