我正试图使用Kendo Mobile的MVVM和JayData Data Access Library开发一款移动应用程序。我遇到了一个问题,我已经研究了大约一个星期,但没有运气。我正在寻找一个由Kendo双向绑定组成的简单示例,该绑定使用由JayData(asKendoDataSource)创建的具有inverteProperty导航属性的模型。我不确定JayData kendo.js模块是否支持包含inverteProperty的模型,并且在测试过程中,即使在获得要与关系一起保存的数据后,检索同一记录也不会将关系数据拉回到视图模型中。
有人能提供一个使用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' });
剑道视图模型(简化):
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绑定和inverteProperty关系时存在一个错误当通过他们的Kendo模块设置对象关系时,他们(JayData)根本不支持自己的Attach方法。因此,当你在传入相关对象的模型上调用Kendo的SET时,传入对象的Entity状态被设置为20(New),JayData试图创建一个新记录,在我的情况下,由于主键冲突而失败。Attach方法将Entity状态设置为未修改。
我知道在JayData的代码中可能有一种更优雅的方法来解决这个问题,但对我来说,只要在使用Kendo set方法设置对象关系之前添加以下行,就可以毫无错误地保存记录。
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')方法来加载Robesz(谢谢)提到的关系数据
很高兴看到JayData在他们的Kendo模块中修复数据保存问题。
JayData默认情况下不加载相关实体,您必须使用include()运算符:
data.context.Expenses.include('Category').toArray(...)
include的参数应该是导航属性的名称。