sencha touch ::关联商店/模型对不创建实例名称功能

时间:2011-06-21 10:32:39

标签: model associations sencha-touch store

我在设置相关的商店/模型概念时遇到了很大的问题。

我有模特/商店

app.models.User = Ext.regModel('app.models.User', {
    fields: [
        {name: 'id',         type: 'int'},
        {name: 'userID',    type: 'string'},
        {name: 'userName',  type: 'string'}
    ],

    associations: [
        {type: 'hasMany', model: 'app.models.Friend', name:'friends', associationKey:'friends'},
    ]
});

app.models.UserFriendsList = Ext.regModel('app.models.UserFriendsList', {
    fields: [
        {name: 'id',         type: 'int'},
        {name: 'userID',     type: 'string'},
        {name: 'userName',  type: 'string'}
    ],

    belongsTo: 'app.models.User',

    associations: [
        {type: 'hasMany', model: 'app.models.Friend',    name: 'friend'}
    ]
});

app.models.Friend = Ext.regModel('app.models.Friend', {
    fields: [
        {name: 'id',         type: 'int'},
        {name: 'userID',    type: 'string'},
        {name: 'userName',  type: 'string'}
    ],
   belongsTo: 'app.models.UserFriendsList',
});

app.stores.userStore = new Ext.data.Store({

    model: 'app.models.User',

    data:[
        {
            "id":                 "01", 
            "userName":         "Username"

            "friends": [
                {    "id":                 "02", 
                    "userName":         "Friend 1"
                },
                {    "id":                 "03", 
                    "userName":         "Friend 2"
                },
            ]

        }
    ]
}); 

然后我用

var currentUser = app.stores.User.getAt(0); 
console.log(currentUser);
var friends = currentUser.friends().getAt(0);
console.log(friends); 

跟踪有关当前加载用户的一些调试信息。

当我使用'associationKey'参数而没有'name'参数时,跟踪显示数据被正确地提取到被跟踪对象'currentUser'的数据部分。但是没有函数friends()可以使用。我只收到错误

TypeError: Result of expression 'currentUser.friends' [undefined] is not a function.

当我使用没有'associationKey'参数(或两个参数)的'name'参数时,会创建实例函数friends()但是没有数据被提取到对象中,因此我无法使用它。

我的代码出了什么问题?或者我对概念的误解在哪里?

日Thnx !!!

编辑:请查看我的文件:http://www.box.net/shared/n4h3rdp1499ihx990v3h

1 个答案:

答案 0 :(得分:3)

您的模型声明和has many associations似乎有些问题。

首先,您的模型名称应该只是简单的语句,而不是完全限定的对象。它使声明更容易。

app.models.User = Ext.regModel('app.models.User', {

应该是:

app.models.User = Ext.regModel('User', {

其次,您需要具有将id彼此正确命名的字段。

app.models.Friend = Ext.regModel('Friend', {
fields: [
    {name: 'user_id', type: 'int'},
    .....
],

现在您的模型名为User,而您的朋友模型引用user_id,Sencha Touch会自动正确使用该关联。

第三,您需要修复您的关联声明。您将属性associationKey添加到关联。在我提到的第一点之后,文档和模型中不存在哪个应该只是'朋友'。

associations: [
    {type: 'hasMany', 
     model: 'Friend', 
     name:'friends', 
    },
]

第四,要获得你需要在商店上加载的朋友。 currentUser.friends().load().getAt(0);

你可以得到花哨的东西,并将不同的外围密钥声明为不同的名称,但此时我只是得到了基本的例子并且正在工作。

Sencha有一个关于associations and validations入门的好教程。