Я пытаюсь разработать мобильное приложение с использованием MVVM и JayData Data Access Library от Kendo Mobile. Я столкнулся с проблемой, с которой я работал около недели, без везения. Я ищу простой пример, состоящий из двухсторонней привязки Kendo с использованием модели, созданной JayData (asKendoDataSource), имеющей свойство навигации inverseProperty. Я не уверен, что модуль JayData kendo.js поддерживает модели, содержащие inverseProperty и в процессе тестирования, даже после того, как данные сохраняются вместе с данными, извлечение одной и той же записи не выведет реляционные данные обратно в viewmodel.Kendo MVVM JayData (asKendoDataSource) inverseProperty с поставщиком webSQL
Может ли кто-нибудь предоставить простой пример сохранения и получения такой модели с помощью поставщика webSql?
Любая помощь очень ценится.
JayData модели (упрощенный):
//Expense Category Model
$data.Entity.extend('data.types.ExpenseCategory', {
Id: { type: 'Edm.Guid', key: true },
CategoryName: { type: 'string', required: true, minLength: 3, maxLength: 26 },
Expenses: { type: Array, elementType: "data.types.Expense", inverseProperty: "Category" }
});
//Expense Model
$data.Entity.extend('data.types.Expense', {
Id: { type: 'Edm.Guid', key: true },
ExpenseDescription: { type: 'string', required: true },
Category: { type: "data.types.ExpenseCategory", inverseProperty: "Expenses" }
});
// Entity Context
$data.EntityContext.extend('data.types.DbContext',
{
ExpenseCategories: { type: $data.EntitySet, elementType: data.types.ExpenseCategory },
Expenses: { type: $data.EntitySet, elementType: data.types.Expense },
});
// Database Context
data.context = new data.types.DbContext({ name: 'sqLite', databaseName: 'cDb' });
Кендо ViewModel (упрощенный):
views.expenseCategoryPicker = kendo.observable({
app: null,
categories: db.context.ExpenseCategories.asKendoDataSource(),
expense: null,
itemClick: function(sender) {
var expense = views.expenseCategoryPicker.expense;
expense.set('Category', sender.data);
...add/update logic
expense.sync();
},
loadExpense: function(dataItem) {
views.expenseCategoryPicker.set('expense', undefined);
views.expenseCategoryPicker.set('expense', dataItem);
},
});
EDIT
Я понял, почему данные не будут сохранить и работать. В модуле kendo.js JayData имеется ошибка при использовании связей привязки Kendo MMVM и inverseProperty. Они (JayData) просто не поддерживают свой собственный метод Attach, когда объектные отношения устанавливаются через их модуль Kendo. Поэтому, когда вы вызываете SET Kendo на модели, проходящей в связанном объекте, состояние Entity объекта, передаваемого в него, устанавливается равным 20 (New), а JayData пытается создать новую запись и в моем случае не удается из-за конфликта первичного ключа. Метод Attach устанавливает состояние Entity немодифицированным.
Я знаю, что, возможно, более элегантный способ исправить это в коде JayData, но для меня просто добавление следующей строки прямо до того, как я использую метод set Kendo для установки отношения к объекту, позволяет записывать запись без ошибок.
itemClick: function(sender) {
var expense = views.expenseCategoryPicker.expense;
//manually set the state so SQL won't try to create a new record
sender.data.innerInstance()._entityState = 10;
expense.set('Category', sender.data);
...
Последующее чтение требует метода Include («модель») для загрузки реляционных данных, как упомянуто Robesz (СПАСИБО)
Было бы хорошо, чтобы увидеть JayData исправить данные сохранить вопрос в их кендо модуль.
Это половина ответа. После сохранения данных вам необходимо включить связанную модель. Я на самом деле просто понял, что это должно было публиковать ... Эта большая проблема для меня заключалась в том, чтобы получить данные для сохранения без ошибки SQL ... поделитесь этим в комментарии к исходному сообщению. Спасибо! –
Для получения более подробной информации см. Редактирование в оригинальном посте. –