Вложенный JSON и ассоциации с Sencha Touch - PullRequest
2 голосов
/ 21 июля 2011

Здесь вопрос состоит из двух частей.Первый - технический вопрос о том, как Sencha анализирует JSON и читает магазины.

У меня есть две модели, Order и User:

Ext.regModel('Order', {
  fields: [
    {name: 'id', type: 'int'},
    {name: 'user_id', type: 'int'},
    {name: 'name', type: 'string'},
    {name: 'price', type: 'float'},
  ],
  belongsTo: 'User'
});

Ext.regModel('User',{
  fields: [
    {name: 'id', type: 'int'},
    {name: 'first_name', type: 'string'},
    {name: 'last_name', type: 'string'},
    {name: 'email', type: 'string'},
  ],
  associations:[
    {type: 'hasMany', model: 'Order', name: 'orders'}
  ]
});

В целом, довольно простая ассоциация.У меня есть следующий JSON, который получен с сервера:

[
  {
    "id":22,
    "price":0.0,
    "name":"My First Order",
    "user_id":3,
    "user": {
      "id": 3,
      "first_name": "Michael",
      "last_name": "Jones",
      "email": "michaeljones@email.com"
    }
  }
]

Наконец, вот мой магазин:

var o = new Ext.data.Store({
    model: "Order",
    sorters: "name",
    getGroupString: function(record){
        return record.get('name')[0]
    },
    proxy: {
        type: 'ajax',
        url: '/orders',
            headers: {'Accept': 'application/json'},
            reader: {
             type: 'json'
            }
    },
    autoLoad: true
});

Ext.regStore("Orders",o);

Когда я читаю данные заказа, я не могу найти ни одногоупоминание о пользователе.Итак, затем я нашел это удобное руководство в документации Sencha: http://dev.sencha.com/deploy/touch/docs/?class=Ext.data.Reader

Однако в документации показан только пример для ассоциации hasMany - она ​​не включает в себя одно извлечение данных из ассоциации ownTo.Я попытался поработать в Интернете пару часов и пришел с пустыми руками.Как правильно извлечь пользовательское поле из поля заказа?

ОБНОВЛЕНИЕ: Я удалил параметры прокси и автозагрузки в своем хранилище и заменил их параметром данных, который содержалта же самая точная строка JSON, возвращенная моим сервером в моем примере.И угадай что?Это сработало.Однако мне все еще нужно исправить эту проблему, чтобы она работала при обмене данными с моим сервером!Есть идеи?

И вторая часть: Что вы думаете о Sencha Touch?Структура кажется очень мощной, но документация и примеры кажутся довольно слабыми.Я также обеспокоен тем, насколько трудным стал анализ этих данных.Есть ли лучшие альтернативы там?

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Я довольно новичок в Sencha и не могу ответить на ваш вопрос как таковой, но, поскольку вы говорите, что он работает, когда вы загружаете данные напрямую, можно обойтись путем получения объекта JSON с простым Ext.Ajax.request () и затем используйте o.loadData (theData).

Кроме того, вы видели это http://dev.sencha.com/deploy/touch/docs/?class=Ext.data.BelongsToAssociation?

Что касается вашего второго вопроса, документация Сенчи, очевидно, могла бы быть лучше, нопо сравнению с обычным дерьмом, которое вы получаете с API, я думаю, что это на самом деле довольно хорошо - вам нужно будет найти непонятные параметры конфигурации независимо от того, какую среду вы выберете.

Мне действительно понравились его стиль + анимация;я не знаю ничего такого, что могло бы иметь такой же уровень «вау-фактора»;Я думаю, что, возможно, стоит написать свой собственный анализатор данных, если вы не найдете элегантного решения.Клиенты не покупают / не используют продукты, потому что код элегантный или структуры данных особенно устойчивы;они покупают их, потому что они шикарны или представлены с помощью шикарного приложения.

Интеграция с SASS + Compass также значительно упрощает пользовательское оформление, чем обычный CSS.

Наконец, я не знаюесли вам это нужно, но я использую альфа-версию «TouchCharts» Сенчи (я думаю, она будет выпущена в ближайшие несколько месяцев), и это очень впечатляет;анимированные диаграммы (замедление), взаимодействие с рядами данных (касание элементов, сравнение элементов, масштабирование), а также автоматическое обновление графиков, таких как просмотры данных.

0 голосов
/ 04 августа 2012

Я столкнулся с той же проблемой.Вопрос имеет несколько потенциальных ответов.

Мне удалось решить проблему, указав, например,

hasMany: [
    { associatedName: 'collectionfield', model: 'collectionmodel'}
]

Также по какой-то причине мне пришлось определить модель как app.model.collectionmodel

{
  id: '1'
  q: 'Foo?',
  answers: [
    { id: 8, assessment_question_answer_id: '1', text: 'bar'},
    { id: 9, assessment_question_answer_id: '1', text: 'baz'},
    { id: 10, assessment_question_answer_id: '1', text: 'steve'},
  ]
}


Ext.define('Hk.model.AssessmentQuestion', { 
...
  hasMany: [
    { associatedName: 'answers', model: 'Hk.model.AssessmentAnswer'}
// ... and then

Ext.define('Hk.model.AssessmentAnswer', {
...
  belongsTo: {model:'Hk.model.AssessmentQuestion', foreignKey: 'assessment_question_id'}
...