Kendo MVVM JayData(asKendoDataSource) inverseProperty с поставщиком WebSQL

Я пытаюсь разработать мобильное приложение, используя MVDM и библиотеку доступа к данным JayData от Kendo Mobile. Я столкнулся с проблемой, над которой я работал около недели без удачи. Я ищу простой пример, состоящий из двустороннего связывания Kendo с использованием модели, созданной JayData (asKendoDataSource), имеющей свойство навигации inverseProperty. Я не уверен, что модуль JayData kendo.js поддерживает модели, содержащие inverseProperty, и в процессе тестирования, даже после получения данных для сохранения с отношением, поиск той же записи не возвращает реляционные данные обратно в модель представления.

Может ли кто-нибудь предоставить простой пример сохранения и получения такой модели с помощью провайдера 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);        
    },
});

РЕДАКТИРОВАТЬ

Я выяснил, почему данные не будут сохранены и обойти. В модуле JayData kendo.js есть ошибка при использовании привязки 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('model') загружал реляционные данные, как упомянуто Робесом (СПАСИБО)

Было бы здорово увидеть, как JayData исправляет проблему сохранения данных в их модуле Kendo.

1 ответ

Решение

JayData не загружает связанные сущности по умолчанию, вы должны использовать оператор include():

data.context.Expenses.include('Category').toArray(...)

Параметр include должен быть именем свойства навигации.

Другие вопросы по тегам