Sencha Touch - доступ к хранилищу связанных моделей JSON через Nested Looping - PullRequest
0 голосов
/ 25 января 2011

Я довольно долго скрывался за переполнением стека и нашел довольно много полезных ответов.Большое спасибо сообществу!Я надеюсь, что смогу вскоре поделиться своими полезными ответами.

Тем временем у меня есть еще одна проблема, которую я не могу решить.Я использую Sencha Touch для создания веб-приложения для телефона, и у меня возникают проблемы с использованием вложенного цикла для перебора некоторого JSON.Я могу получить данные первого уровня, но не элементы, вложенные в этот первый уровень.Существует несколько связанных с ExtJS потоков , но я решил создать свой собственный, поскольку ExtJS и Touch расходятся тонкими, но важными способами.Во всяком случае, вот некоторый код, чтобы показать, где я нахожусь:

JSON (усечено - JSON генерируется PHP / MYSQL, и в настоящее время на самом деле есть три подуровня с заголовком, ко всем из которых я могу получить доступЭто подуровень "элементы", через который я не могу перебрать):

{
"lists": [
    {
        "title": "Groceries",
        "id": "1",
        "items": [
            {
                "text": "contact solution - COUPON",
                "listId": "1",
                "id": "4",
                "leaf": "true" 
            },
            {
                "text": "Falafel (bulk)",
                "listId": "1",
                "id": "161",
                "leaf": "true" 
            },
            {
                "text": "brita filters",
                "listId": "1",
                "id": "166",
                "leaf": "true" 
            }
        ] 
    } 
]

}

Store:

var storeItms = new Ext.data.Store({
    model: 'Lists',
    proxy: {
        type: 'ajax',
        method: 'post',
        url : LIST_SRC,
        extraParams: {action: 'gtLstItms'},
        reader: {
            type: 'json',
            root: 'lists'
        }
    }
});

Рабочий цикл:

storeItms.on('load', function(){
    var lstArr = new Array();
    storeItms.each(function(i) {
        var title = i.data.title;
        lstArr.push(i.data.title);
    });
    console.log(lstArr);
});

Неработающий вложенный цикл:

storeItms.on('load', function(){
    var lstArr = new Array();
    storeItms.each(function(i) {
        var title = i.data.title;
        var id = i.data.id;
        title.items.each(function(l) {
            lstArr.push(l.data.text);
        });
    });
    console.log(lstArr);
});

Неработающий вложенный цикл выдает ошибку «Невозможно вызвать метод« каждый »из неопределенного», ссылаясь на «title.items».каждый ... '

Я подозреваю, что это потому, что я не установил title в качестве ключа для установки пары ключ: значение, поэтому он просто видит список строк ... но явроде как в замешательстве.

Я должен упомянуть, что магазин заполнен двумя моделями, которые были связаны друг с другом.Я знаю, что Магазин может получить доступ ко всему, потому что я могу выполнять вложенные итерации с помощью XTemplate.

Любая помощь будет высоко оценена и, надеюсь, вскоре будет возвращена сообществу в натуральной форме! '

-Эрик

Ответы [ 3 ]

0 голосов
/ 31 марта 2012

Используя новую оболочку sencha touch 2, вы можете создавать ассоциации внутри моделей точно так же, как возвращается ваш json. Установите флажок Sencha Touch 2 Model Document , в котором указаны различные параметры конфигурации модели. Вы можете обратиться к этому примеру Вложенный список ST2 .

Надеюсь, это поможет.

0 голосов
/ 02 мая 2012

"title" не является перечисляемым объектом, это строка. Чтобы перебрать строку, вам нужно разделить ее, чтобы преобразовать в массив.

Кроме того, вместо использования Ext.each попробуйте простой for (var x в obj) {} или for (var xc в obj.prop) {} Если это работает, метод ext.each также должен работать, но если ext не может выполнить итерацию объекта, он просто потерпит неудачу.

0 голосов
/ 29 января 2011

Эрик, почему цикл?

Если ваши модели связаны так же, как вложенный JSON, то вы должны просто установить autoLoad: true в магазине, расслабиться и наслаждаться.

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

i.data.items

Также, если объект является моделью, вы можете использовать .get () вместо объекта данных:

var title = i.get('title);
...