Попытка привязать магазин к ViewModel
Я привык к ExtJs с шаблоном MVC, и я пытаюсь реализовать шаблон MVVM. Я не могу привязать магазин к своему мнению.
У меня есть основная сетка, и я пытаюсь открыть сетку деталей при выборе линии.
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
,
Но для магазина я получаю ошибки:
[E] Ext.data.schema.Schema.lookupEntity (): Нет такого объекта "rma.Detail".
Uncaught Error: нет такой сущности "rma.Detail".
Я не понимаю, почему ссылка на модель (model: 'rma.Detail'
) не распознается во ViewModel. Используя шаблон MVC, мне никогда не нужно было ссылаться на модель, я всегда ссылался на магазин, используя ссылку, аналогичную rma.Details
,
Главный вопрос: как мне объявить модель rma.Details
в ViewModel?
Вспомогательные вопросы:
- Это правильный способ установить значение
id
в представлении. ({xtype: 'rma-details', viewModel: {data: {id: id}}}
) - Я привык определять прокси всегда в классе магазина. Здесь у меня больше нет класса магазина, потому что он определен во ViewModel. Правильно ли объявить это в классе модели, как я это делал выше?
1 ответ
Вам необходимо определить схему, а затем пространство имен для нее в объявлении модели. Или, что еще лучше, в базовой модели (см. Сводку схем из документации API).
При описании связей между сущностями желательно использовать сокращенные имена, которые не содержат общую часть пространства имен. Это называется entityName, а не его именем класса. По умолчанию entityName является полным именем класса. Однако, если используется пространство имен, общая часть может быть отброшена, и мы можем получить более короткое имя.
Вы попытались использовать сокращенное имя здесь, но, поскольку вы не определили пространство имен схемы, оно не может найти его в классе модели.
Вспомогательные ответы:
- Да, ты можешь это сделать.
- Здесь нет правильного или неправильного, на мой взгляд. Вы можете объявить прокси рядом с фильтрами в модели представления. Вы также можете объявить хранилище в отдельном классе и затем использовать его в view model (это подход, который я использую), указав здесь только конфиги, которые привязаны к каким-либо данным view model.