sencha touch :: связанная пара магазин / модель не создает функцию имени экземпляра - PullRequest
0 голосов
/ 21 июня 2011

У меня большая проблема с настройкой концепции магазина / модели.

У меня есть модели / магазин

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.

Когда я использую параметр 'name' без параметра 'associationKey' (или обоих параметров), функция экземпляраfriends () создан, но данные не извлекаются в объект, поэтому я не могу его использовать.

Что не так с моим кодом?Или где мое недопонимание концепции?

THNX !!!

РЕДАКТИРОВАТЬ: пожалуйста, посмотрите мои файлы: http://www.box.net/shared/n4h3rdp1499ihx990v3h

1 Ответ

3 голосов
/ 21 июня 2011

Похоже, у вас есть несколько проблем с объявлениями модели, а имеет много ассоциаций .

Во-первых, имена вашей модели должны быть простыми утверждениями, а не точечными полностью квалифицированными объектами. Это облегчает декларации.

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

Должно быть:

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

Во-вторых, вам нужно иметь поля, которые связывают идентификаторы друг с другом, правильно названные.

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 есть хорошее руководство по началу работы с ассоциациями и проверками .

...