загрузить отдельный объект в хранилище данных в сенсорном Сенча - PullRequest
4 голосов
/ 26 апреля 2011

Я пытаюсь загрузить один объект JSON, используя сенсорный Сенча. Когда я работаю с массивами, все хорошо, но я не нашел способа загрузить отдельный объект в Ext.data.Store

вот пример того, что я пытаюсь загрузить:

{"person":{"name":"John","surname":"Fox"}}

и это не работает. после просмотра этой записи,

Я попытался загрузить следующее, и это сработало:

[{"person":{"name":"John","surname":"Fox"}}]

Мои вопросы: есть ли способ загрузить его без []? Мне пришлось изменить свой код на стороне сервера, чтобы сделать это, и мне кажется, что запах кода ... Я хочу иметь возможность загружать один объект json без помещения его в список.

вот мой прокси-код Sencha Touch:

Ext.regModel("Person", {
    fields: ['name','surname']

});

var store = new Ext.data.Store({


            model : "Person",
            autoLoad : true,

            proxy: {
                type: 'ajax',
                url : 'my json url...',
                reader: {
                    type: 'json',
                    record: 'person'
                }
            }
        });

Кстати, мой код на стороне сервера написан на Ruby on Rails.

Ответы [ 4 ]

9 голосов
/ 19 мая 2011

Animal от Ext Development Team дала это очень полезное решение:

reader: {
    type: 'json',
    root: function(data) {
        if (data.users) {
            if (data.users instanceof Array) {
                return data.users;
            } else {
                return [data.users];
            }                    
        }                
    }
}

Просто используя функцию от имени root, вы можете убедиться, что читатель получает объект в массиве.

5 голосов
/ 27 апреля 2011

update : способ получить доступ к одному объекту json с помощью sencha - просто сделать простой запрос и не использовать хранилище данных.Вот пример кода, который делает это:

Ext.ns('myNS');

Ext.Ajax.request({
    url: 'my url',
    method: 'GET',
    params: {
        someParam: 'someValue'
    },
    success: function(result, request) {
        var json = Ext.decode(result.responseText);
        myNS.loadedPerson = json.person;
    },
    failure: function(result, request) {
        Ext.Msg.alert('Error!', 'There was a problem while loading the data...');
    }
});

Если вы все еще настаиваете на использовании хранилища данных - вот возможное решение на стороне сервера, которое поддерживает спокойный API: вот что я сделал для того, чтобычтобы сохранить мой API спокойным:

Я добавил новый тип MIME под названием sencha, который ведет себя точно так же, как json, но также заключает json в круглые скобки [].

Это может быть (и, вероятно,) излишнее, но это не мешает моему JSON API.Вот код для нового типа MIME:

Mime::Type.register_alias "application/json", :sencha

#Add the renderer, and register a responder:
require 'action_controller/metal/renderers'
require 'action_controller/metal/responder'

# This is also how Rails internally implements its :json and :xml renderers
# Rarely used, nevertheless public API
ActionController::Renderers.add :sencha do |json, options|
  json = ActiveSupport::JSON.encode(json) unless json.respond_to?(:to_str)
  # Add [ ] around the response
  json = "[#{json}]"
  json = "#{options[:callback]}(#{json})" unless options[:callback].blank?
  self.content_type ||= Mime::JSON
  self.response_body = json
end

# This sets up a default render call for when you do
# respond_to do |format|
#   format.sencha
# end
class ActionController::Responder
  def to_sencha
    controller.render :sencha => resource
  end
end

, это позволяет мне определить следующий прокси (обратите внимание на формат: 'sencha') на стороне клиента:

proxy: {
        type: 'rest',
        format: 'sencha',
        url :   my server url,
        reader: {
            type: 'json',
            record: 'person'
        }
    }

Таким образом, я все еще могу сохранять успокоительный API и рассматривать представление Sencha в формате json как другой способ представления ресурсов (например, json / xml / yaml)

2 голосов
/ 26 апреля 2011

Не уверен, что это то, что вам нужно, но вы можете загрузить его через модель, например:

var oneperson = new Person({id: anId});

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

persons = [*persons]
0 голосов
/ 26 апреля 2011

Я согласен с iwiznia , Ext.data.Store всегда ждет ответа [...], и, вероятно, вам следует изменить серверный код, чтобы вернуть массив людей.Возможно, вам также следует попытаться использовать стиль REST для вставки вашего серверного и клиентского кода.

...