Kendo MVVM JayData(asKendoDataSource)与webSQL提供程序的inverseProperty

时间:2014-02-10 03:39:34

标签: kendo-ui jaydata

我正在尝试使用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模块中的数据保存问题。

1 个答案:

答案 0 :(得分:1)

JayData默认不加载相关实体,你必须使用include()运算符:

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

include的参数应该是导航属性的名称。