2014-02-10 1 views
0

Я пытаюсь разработать мобильное приложение с использованием 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 исправить данные сохранить вопрос в их кендо модуль.

ответ

1

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

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

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

+0

Это половина ответа. После сохранения данных вам необходимо включить связанную модель. Я на самом деле просто понял, что это должно было публиковать ... Эта большая проблема для меня заключалась в том, чтобы получить данные для сохранения без ошибки SQL ... поделитесь этим в комментарии к исходному сообщению. Спасибо! –

+0

Для получения более подробной информации см. Редактирование в оригинальном посте. –