我正在尝试使用Kendo Mobile的MVVM和JayData数据访问库开发移动应用程序。我遇到了一个我已经工作了大约一个星期但没有运气的问题。我正在寻找一个简单的例子,包括使用由具有inverseProperty导航属性的JayData(asKendoDataSource)创建的模型的Kendo双向绑定。我不确定JayData kendo.js模块是否支持包含inverseProperty的模型,并且在测试过程中,即使在获取与关系一起保存的数据之后,检索相同的记录也不会将关系数据拉回到viewmodel中。
有人能提供一个使用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' });
Kendo 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);
},
});
修改
我弄清楚为什么数据无法保存并解决问题。使用Kendo MMVM绑定和inverseProperty关系时,JayData的kendo.js模块中存在一个错误。 当通过Kendo模块设置对象关系时,他们(JayData)根本不支持自己的Attach方法。因此,当您在传递相关Object的模型上调用Kendo的SET时,传入的Object上的Entity状态设置为20(New),JayData尝试创建新记录,并且在我的情况下由于主键冲突而失败。 Attach方法将Entity状态设置为unmodified。
我知道在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模块中的数据保存问题。
答案 0 :(得分:1)
JayData默认不加载相关实体,你必须使用include()运算符:
data.context.Expenses.include('Category').toArray(...)
include的参数应该是导航属性的名称。