2013-10-24 4 views
5

Я изо всех сил пытался понять, как использовать hasMany и принадлежит для довольно когда-нибудь. Мое понимание hasMany - это соотношение 1: много и принадлежит. Это много: 1 отношение - в сторону:, так ли это означает, что если у вас есть отношения hasMany, то требуется принадлежность к его дочерней модели? Я прочитал несколько статей по этому вопросу:ExtJS 4: Понимание hasMany и принадлежит

Еще немного запутался, хотя. Скажем, у меня есть следующие данные:

var data = { 
    "config": { 
    "name": "blah", 
    "id": 1, 
    "someconfig": [{ 
     "name": "Services", "tabs": [{ 
      "id": 0, "name": "Details", "layout": "hbox" 
      }, { 
      "id": 1, "name": "Sources", "layout": "hbox" 
      }, { 
      "id": 2, "name": "Paths", "layout": "hbox" 
      }, { 
      "id": 3, "name": "Ports", "layout": "hbox" 
      }, { 
      "id": 4, "name": "Levels", "layout": "hbox" 
      }, { 
      "id": 5, "name": "Notes", "layout": "hbox" 
      }] 
     }, { 
     "name": "Services2", "tabs": [{}] 
     }] 
    } 
}; 

Я хотел бы создать модель для конфигурации:

Ext.define('Config', { 
    extend: 'Ext.data.Model', 
    fields: ['name'], 
    hasMany: [{ 
    name: 'someconfig', 
    model: 'Someconfig', 
    associationKey: 'someconfig' 
    }], 
    proxy: { 
    type: 'memory', 
    data: data, 
    reader: { 
     type: 'json', 
     root: 'config' 
    } 
    } 
}); 

Так Config может иметь много Someconfigs, потому что в данных, someconfig представляет собой массив объектов. Вот модель Someconfig:

Ext.define('Someconfig', { 
    extend: 'Ext.data.Model', 
    fields: [ 
    'name' 
    ], 
    hasMany: [{ 
    name: 'tabs', 
    model: 'Tabs', 
    associationKey: 'tabs' 
    }] 
}); 

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

Ext.define('Tabs', { 
    extend: 'Ext.data.Model', 
    fields: [ 
    'id', 
    'name', 
    'layout' 
    ], 
    belongsTo: [{ 
    name: 'tabs', 
    model: 'Someconfig', 
    associationKey: 'tabs' 
    }] 
}); 

Теперь, принадлежитТо есть, потому что я возился с этим свойством. Несмотря на это, я не могу получить доступ к вкладкам из Someconfig, но я могу получить доступ к Someconfig из Config. Посмотрите на этот код:

Config.load(1, { 
    success: function(record, operation) { 
    console.log(record.get('name')); // works 
    console.log(record.someconfig().getCount()); // works, gives me 2 
    console.log(record.someconfig().data.items[0].data); // only prints out name and config_id 
//  console.log(record.someconfig().tabs()); // doesn't exist 
    } 
}); 

jsFiddle: demo

То, что я хочу знать, я не должен быть в состоянии получить доступ вкладки() из someconfig(), или я не понимаю отношения? Если это первый, как я могу исправить свой код?

Перекресток с Sencha forums.

ответ

5

Есть несколько вещей, которые не так с вашим подходом здесь:

  1. При вызове поглотитель для отношений с один-ко-многим, вы на самом деле получения ссылки на объект в магазин, который содержит набор связанных объектов, поэтому попытка получить отношение вкладки для магазина не имеет смысла.
  2. Вы должны получить один элемент из магазина отношений, а затем получить связанные с ним язычки по вызывающему в язычки метод, которые возвращают хранилище объектов, содержащий набор вкладок для этого конкретного экземпляра.
  3. Если вы хотите получить доступ к любому из связанных вкладок вы должны снова выбрать один объект из этого магазина, чтобы пробежать все отношения дерева вы должны сделать что-то вроде этого:
someconfig = record.someconfig().getAt(0); 
sometab = someconfig.tabs().getAt(0); 

Вот modified version of your code, который работает. Надеюсь, что это поможет решить вашу проблему.

+0

Yup. Вы совершенно правы, и это те выводы, которые я пришел вчера после того, как поиграл с ним еще немного. Благодаря! – incutonez

+0

Так что интересно об этом, 'someconfig' не отображается в данных' record' ... Я могу получить доступ только к 'someconfig', вызвав его метод. Для меня это не имеет смысла ... если модель 'config' hasMany' someconfig', она должна отображаться в 'config' как массив моделей! – incutonez

Смежные вопросы